跳到主要内容

C 语言数组与指针的关系

提示
  1. 数组和指针的关系:在C语言中,数组名在大多数情况下会转换为指向其第一个元素的指针。
  2. 数组元素的地址和指针运算:数组中每个元素的地址可以通过指针运算获得,例如&x[1]相当于x+1,且x[1]相当于*(x+1)
  3. 使用指针访问数组元素:可以通过指针来访问和操作数组元素,如在循环中使用*(x+i)来访问x数组的第i个元素。

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

数组与指针的关系

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

#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("数组x的地址: %p", x);

return 0;
}

输出

&x[0] = 1450734448
&x[1] = 1450734452
&x[2] = 1450734456
&x[3] = 1450734460
数组x的地址: 1450734448

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

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

数组与指针之间的关系

从上面的例子可以清楚地看到,&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("输入6个数字: ");

for(i = 0; i < 6; ++i) {
// 等同于scanf("%d", &x[i]);
scanf("%d", x+i);

// 等同于sum += x[i]
sum += *(x+i);
}

printf("总和 = %d", sum);

return 0;
}

运行程序后,输出将是:

输入6个数字: 2
3
4
4
12
4
总和 = 29

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

在大多数情况下,数组名称会衰减为指针。简单来说,数组名称被转换为指针。这就是为什么您可以使用指针访问数组元素的原因。然而,您应该记住指针和数组不是一回事

有一些情况下,数组名称不会衰减为指针。要了解更多,请访问:数组名称不衰减为指针的情况

示例2:数组和指针

#include <stdio.h>
int main() {

int x[5] = {1, 2, 3, 4, 5};
int* ptr;

// ptr被赋予第三个元素的地址
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)会给我们第二个元素。