我正在尝试使用以下程序来理解指针和数组。
#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
并分配了 &arr 的值。如果我尝试增加 ptr2,它会按预期增加 5 个元素。 ptr3
、ptr4
和 ptr5
[编辑] 当我执行 int *ptr = &arr
时,指向数组的指针会自动类型转换为 int *
吗?
我可以假设 &arr, arr, &arr[0]
表达式实际上是相同的,因为它们产生相同的值?而这个值的算术实际上取决于分配的变量的类型?
最佳答案
嗯,不,&arr
、arr
和 &arr[0]
不一样。详细说明一下,
&arr
是指向数组的指针,整个数组。您可以引用数据类型,以便更好地理解。&arr
这里的类型是int (*) [5]
,即指向 5 个int
数组的指针。arr
是数组名称,在某些情况下,会衰减为指向数组第一个元素的指针。&arr[0]
在任何情况下都是数组第一个元素的地址。
建议:启用所有编译器警告,它应该告诉您哪里出了问题。
那么,根据上面的理解,
int *ptr = &arr;
是错误的,因为它们不是兼容的类型。同样适用
int (*ptr5)[5] = &arr[0];
因此,您尝试对这些变量执行的任何操作(及其结果,如果有)都未定义。
关于c - 数组指针的自动类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40127402/