C 数组和指针

本文介绍了数组和指针之间的关系,以及使用指针访问数组元素。

在 C 语言中,数组和指针关系密切,您可以通过指针很方便的处理数组。

在了解数组和指针之间的关系之前,请先了解以下两个主题:

数组和指针的关系

数组是一个按顺序存储的数据块。让我们编写一个程序来打印数组元素的地址。

#include <stdio.h>
int main() {
   int x[4];
   int i;

   for(i = 0; i < 4; ++i) {
      printf("&x[%d] = %p\n", i, &x[i]);
   }

   printf("Address of array x: %p", x);

   return 0;
}

输出

&x[0] = 1450734448
&x[1] = 1450734452
&x[2] = 1450734456
&x[3] = 1450734460
Address of array x: 1450734448

数组的两个连续元素的地址之间相差 4, 这是因为在我们的编译器上 int 类型的大小是 4 个字节。

请注意,&x[0]x 的地址是一样的。这是因为变量名 x 指向数组的第一个元素。

数组和指针的关系
数组作为指针

从上面的例子,很明显 &x[0] 等价于 x,并且, x[0] 等价于 *x

相似地,

  • &x[1] 等价于 x+1 并且 x[1] 等价于 *(x+1)
  • &x[2] 等价于 x+2 并且 x[2] 等价于 *(x+2)
  • &x[i] 等价于 x+i 并且 x[i] 等价于 *(x+i)

示例 1:指针和数组

#include <stdio.h>
int main() {
  int i, x[6], sum = 0;
  printf("Enter 6 numbers: ");
  for(i = 0; i < 6; ++i) {
  // Equivalent to scanf("%d", &x[i]);
      scanf("%d", x+i);

  // Equivalent to sum += x[i]
      sum += *(x+i);
  }
  printf("Sum = %d", sum);
  return 0;
}

输出

#include <stdio.h>
int main() {
  int i, x[6], sum = 0;
  printf("Enter 6 numbers: ");
  for(i = 0; i < 6; ++i) {
  // Equivalent to scanf("%d", &x[i]);
      scanf("%d", x+i);

  // Equivalent to sum += x[i]
      sum += *(x+i);
  }
  printf("Sum = %d", sum);
  return 0;
}

在这里,我们声明了一个 6 个元素的数组 x。为了访问数组的元素,我们使用了指针。

在大多数情况下,数组名称衰减为指针。简单来说,数组名被转换为指针。这就是您可以使用指针访问数组元素的原因。但是,您应该记住,指针和数组并不相同

示例 2:数组和指针

#include <stdio.h>
int main() {
  int x[5] = {1, 2, 3, 4, 5};
  int* ptr;

  // ptr is assigned the address of the third element
  ptr = &x[2];

  printf("*ptr = %d \n", *ptr);   // 3
  printf("*(ptr+1) = %d \n", *(ptr+1)); // 4
  printf("*(ptr-1) = %d", *(ptr-1));  // 2

  return 0;
}

当你运行程序时,输出将是:

*ptr = 3
*(ptr+1) = 4
*(ptr-1) = 2

在这个例子中,第三个元素的地址 &x[2] 被分配给 ptr 指针。因此,*ptr 的值是 3

然后,*(ptr+1) 返回了数组第 4 个元素的值。同样, *(ptr-1) 返回了数组第 2 个元素的值。