深入理解C语言数组与指针的关系
C语言数组与指针的关系
本教程讲解C语言中数组与指针的关系,并演示如何使用指针访问数组元素。
在学习数组与指针的关系前,请确保已掌握以下两个主题:
- 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
数组 x 相邻元素相差 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("请输入 6 个数字: ");
for(i = 0; i < 6; ++i) {
// 等价于 scanf("%d", &x[i]);
scanf("%d", x+i);
// 等价于 sum += x[i]
sum += *(x+i);
}
printf("Sum = %d", sum);
return 0;
}
运行输出:
请输入 6 个数字: 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 指向第三个元素
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) 给出第二个元素。
C语言