C 数组指针

学习C - C数组指针

数组和指针

数组是同一类型的值的集合。

指针是可以引用另一个的变量(存储器地址)变量。

你可以使用指针来保存不同的地址变量,只要它们“全部是相同的类型。

没有索引值的数组名称指的是数组中第一个元素的地址。

您可以更改指针中包含的地址,但是你不能改变数组名引用的地址。

下面的代码显示一个数组名称本身指的是一个地址。


    #include <stdio.h>
    int main(void)
    {
      char multiple[] = "My string";

      char *p = &multiple[0];
      printf("The address of the first array element  : %p\n", p);

      p = multiple;
      printf("The address obtained from the array name: %p\n", multiple);
      return 0;
    }

从输出我们知道表达式& multiple [0] 产生与表达式multiple相同的值。

上面的代码生成以下结果。



例2

因为多个计算结果的第一个字节的地址数组和& multiple [0]求值到数组的第一个元素的第一个字节。

此程序演示向指针添加整数值的效果。


    #include <stdio.h>
    #include <string.h>
    int main(void)
    {
      char multiple[] = "a string";
      char *p = multiple;
      for(int i = 0 ; i < strnlen(multiple, sizeof(multiple)) ; ++i) {
         printf("multiple[%d] = %c  *(p+%d) = %c  &multiple[%d] = %p  p+%d = %p\n", i, multiple[i], i, *(p+i), i, &multiple[i], i, p+i);
      }
      return 0;
    }

上面的代码生成以下结果。

例3

向p中的地址添加整数n的计算结果与 multiple [n] 相同。


#include <stdio.h>
int main(void)
{
  long multiple[] = {15L, 25L, 35L, 45L};
  long *p = multiple;

  for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i) {
    printf("address p+%d (&multiple[%d]): %llu        *(p+%d)   value: %d\n", i, i, (unsigned long long)(p+i),  i,  *(p+i));
  }
  printf("\n    Type long occupies: %d bytes\n", (int)sizeof(long));
  return 0;
}

上面的代码生成以下结果。

例4

请注意,您可以在此示例中直接使用数组名称。 你可以写for循环:


#include <stdio.h>
int main(void)
{
      long multiple[] = {15L, 25L, 35L, 45L};
      long *p = multiple;


      for(int i = 0 ; i < sizeof(multiple)/sizeof(multiple[0]) ; ++i)
        printf("address p+%d (&multiple[%d]): %llu        *(p+%d)   value: %d\n",
                      i, i, (unsigned long long)(multiple+i),  i,  *(multiple+i));

      return 0;
}

表达式multiple和multiple + i都计算一个地址。

将乘以1乘以1得到的地址     数组中的下一个元素,这是在内存中的4个字节。

数组名称指的是固定地址,不是指针。

您可以使用数组名称作为表达式中的指针,但不能修改它。

上面的代码生成以下结果。

多维数组和指针

下面的代码就在这里探索与指针相关的多维数组。


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      printf("address of my_array        : %p\n", my_array);
      printf("address of my_array[0][0]  : %p\n", &my_array[0][0]);
      printf("value of my_array[0]       : %p\n", my_array[0]);
      return 0;
    }

下面的代码就在这里探索与指针相关的多维数组。...

所以当你使用数组名访问二维数组时使用a单个索引值my_array [0],你“引用其中一个子数组的地址。

总结表达式:

    my_array
    my_array[0]
    &my_array[0][0]

这些都具有相同的值:my_array是二维数组的地址的炭元素, my_array [0] 是一个char元素的一维数组的地址,它是一个子数组 my_array & my_array [0] [0] 是char类型的数组元素的地址。

上面的代码生成以下结果。

例5

以下代码显示如何在二维数组中获取值。


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      // List all elements of the array
      for(int i = 0 ; i < 9 ; ++i)
         printf(" my_array: %c\n", *(*my_array + i));
      return 0;
    }

上面的代码生成以下结果。

例6

你可以在这里看到多维数组和点:


    #include <stdio.h>
    int main(void)
    {
      char my_array[3][3] = {
                           {"1","2","3"},
                           {"4","5","6"},
                           {"7","8","9"}
                         };

      char *pmy_array = *my_array;             // A pointer to char
      for(int i = 0 ; i < 9 ; ++i)
      printf(" my_array: %c\n", *(pmy_array + i));

      return 0;
    }

上面的代码生成以下结果。