我对指针的概念很陌生,最近发现了这行代码:
int arr[]={1,2,3};
int (*p)[3] = &arr;
上述代码行之间的区别是什么:
int arr[]={1,2,3};
int *p = arr;
为什么会出错:
int arr[]={1,2,3};
int *p = &arr;
答案 0 :(得分:4)
类型差异
中
int (*p)[3] = &arr;
的类型
int (*)[3]
是3
,即指向int
p
s数组的指针。
int *p = arr;
的类型:
int*
只是int
,即指向*p
的指针。
因此,
在第一种情况下,
int
评估为3个int [3]
的数组,即*p
。
在第二种情况下,
int
只评估arr
。
要获取(*p)[0]
的第一个元素,您必须在第一种情况下使用p[0][0]
或arr
。
要获取*p
的第一个元素,您必须在第二种情况下使用p[0]
或arr
。
要获取(*p)[2]
的最后一个元素,您必须在第一种情况下使用p[0][2]
或arr
。
要获取*(p+2)
的最后一个元素,您必须在第二种情况下使用p[2]
或{{1}}。
答案 1 :(得分:2)
他们只是不同的事情。
int arr[]={1,2,3};
int (*p1)[3] = &arr; // pointer to array (of 3 ints)
int *p2 = arr; // pointer to int
p1
是指向数组(3个整数)的指针,然后初始化为指向arr
。 p2
是一个指向int的指针,作为array-to-pointer decay的结果,它被初始化为指向arr
的第一个元素。
然后您可以将它们用作:
(*p1)[0]; // same as arr[0]
p1[0][1]; // same as arr[1], note p1[1] will be ill-formed.
p2[0]; // same as arr[0]