我很新的指针的概念,最近遇到这行代码来:C++数组分配地址的指针
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;
我很新的指针的概念,最近遇到这行代码来:C++数组分配地址的指针
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;
差分
在
int (*p)[3] = &arr;
类型的p
是int (*)[3]
,即指针的3
阵列int
s。
在该类型的p
:
int *p = arr;
简直是int*
,即一个指向int
。
因此,
在第一种情况下,
*p
计算结果为3 int
秒的阵列,即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]
。
只是它们不一样的东西。
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]
我想你应该在别处学习编程,因为这里的人不喜欢它。例如http://www.cplusplus.com/doc/tutorial/ –
这是一个不错的问题,除了第三部分是标准的数组衰减并在这里很好地解释:[什么是数组衰减?](http:///stackoverflow.com/questions/1461432/what-is-array-decaying) – user4581301
这是一个“类型”的东西。一旦你可以准确地描述每种情况下'p'的*类型*和你分配给它的表达式的类型*,清晰度将是自我揭示的,这既是为什么前两个例子编译没有投诉,为什么第三不会。 – WhozCraig