我试图用以下程序理解指针和数组。
#include <stdio.h>
int main(void) {
int arr[] = {1, 2, 3, 4, 5};
int *ptr = &arr;
int *ptr1 = arr;
int (*ptr2)[5] = &arr;
int (*ptr3)[5] = arr;
int *ptr4 = &arr[0];
int (*ptr5)[5] = &arr[0];
printf("%d %d %d %d %d %d\n",*(ptr+1), *(ptr1+1), *(ptr2+1),
*(ptr3+1), *(ptr4+1), *(ptr5+1));
return 0;
}
在前面的一个问题referring to arrays as pointers中,我读到arr
是指向第一个元素的指针,其中&arr
是指向整个数组的指针。
如果我们在ptr
和ptr1
上进行指针算法,如上面的程序所示,它们都产生相同的结果,即它们都是指向整数的指针,因为它们被分配给类型的变量int *
。
但是我创建了一个指向5个元素ptr2
的数组的指针,并指定了&amp; arr的值。如果我尝试增加ptr2,它会按预期增加5个元素。 ptr3
,ptr4
和ptr5
[编辑]当我int *ptr = &arr
时,指向数组的指针会自动输入到int *
吗?
我可以假设&arr, arr, &arr[0]
表达式实际上是相同的,因为它们产生相同的值吗?对这个值的算术实际上取决于赋值变量的类型?
答案 0 :(得分:2)
嗯,不,&arr
,arr
和&arr[0]
不一样。详细说明,
&arr
是指向数组的指针,即整个数组。您可以参考数据类型,以便更好地理解。 &arr
此处的类型为int (*) [5]
,即指向5 int
s数组的指针。
arr
是数组名称,在某些情况下,会衰减到指向数组第一个元素的指针。
&arr[0]
是数组中第一个元素的地址,在任何情况下都可以。建议: 启用所有编译器警告,它应该告诉您出错的地方。
所以,根据上述理解,
int *ptr = &arr;
错误,因为它们不兼容。同样适用于
int (*ptr5)[5] = &arr[0];
因此,您尝试对这些变量执行的任何操作(及其结果,如果有的话)都没有定义。
答案 1 :(得分:0)
不,&amp; arr和arr在C中不相同,因为arr是指向arr的第一个元素的指针,而&amp; arr是指向arr本身的指针。然而,arr和&amp; arr [0]的作用相同,因为它们都指向数组的第一个元素(它们仍然不完全相同)。换句话说,您可以理解 arr和&amp; arr [0]指向4字节位置,而&amp; arr指向5x4字节位置因此它们是不同的。