在本教程中,您将了解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("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+1 和 x[1]等同于*(x+1)。
&x[2]等同于x+2 和 x[2]等同于*(x+2)。
...
基本上&x[i]等同于x+i 和 x[i]等同于*(x+i)。
#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。为了访问数组的元素,我们使用了指针。
在大多数情况下,数组名称会衰减为指针。简而言之,数组名称将转换为指针。这就是为什么您可以使用指针访问数组元素的原因。但是,您应该记住,指针和数组并不相同。
在某些情况下,数组名称不会衰减到指针。
#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)得到第四个元素。类似地,输出*(tr-1)将得到第二个元素。