原文: https://www.programiz.com/c-programming/c-pointers-arrays

在本教程中,您将了解 C 编程中数组与指针之间的关系。 您还将学习使用指针访问数组元素。

在了解数组与指针之间的关系之前,请确保检查以下两个主题:


数组和指针之间的关系

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

  1. #include <stdio.h>
  2. int main() {
  3. int x[4];
  4. int i;
  5. for(i = 0; i < 4; ++i) {
  6. printf("&x[%d] = %p\n", i, &x[i]);
  7. }
  8. printf("Address of array x: %p", x);
  9. return 0;
  10. }

输出

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

数组x的两个连续元素之间相差 4 个字节。 这是因为int的大小为 4 个字节(在我们的编译器中)。

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

数组和指针之间的关系 - 图1

从上面的示例中,很明显&x[0]等于x。 并且,x[0]等效于*x

同样,

  • &x[1]等效于x+1x[1]等效于*(x+1)
  • &x[2]等效于x+2x[2]等效于*(x+2)
  • 基本上,&x[i]等效于x+ix[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;
}

运行该程序时,输出为:

Enter 6 numbers:  2
 3
 4
 4
 12
 4
Sum = 29

在这里,我们声明了一个由 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)给我们第四个元素。 同样,打印*(ptr-1)提供了第二个要素。