2016-07-15 121 views
2

我很新的指针的概念,最近遇到这行代码来: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; 
+1

我想你应该在别处学习编程,因为这里的人不喜欢它。例如http://www.cplusplus.com/doc/tutorial/ –

+1

这是一个不错的问题,除了第三部分是标准的数组衰减并在这里很好地解释:[什么是数组衰减?](http:///stackoverflow.com/questions/1461432/what-is-array-decaying) – user4581301

+0

这是一个“类型”的东西。一旦你可以准确地描述每种情况下'p'的*类型*和你分配给它的表达式的类型*,清晰度将是自我揭示的,这既是为什么前两个例子编译没有投诉,为什么第三不会。 – WhozCraig

回答

4

差分

int (*p)[3] = &arr; 

类型的pint (*)[3],即指针的3阵列int s。

在该类型的p

int *p = arr; 

简直是int*,即一个指向int

因此,

在第一种情况下,

*p计算结果为3 int秒的阵列,即int [3]

在第二种情况下,

*p计算结果为只是一个int


要获得arr第一要素,你就必须在第一种情况下使用(*p)[0]p[0][0]

要获得arr的第一个元素,您必须在第二种情况下使用*pp[0]


要获得arr最后一个元素,你就必须在第一种情况下使用(*p)[2]p[0][2]

要获得arr的最后一个元素,您必须在第二种情况下使用*(p+2)p[2]

2

只是它们不一样的东西。

int arr[]={1,2,3}; 
int (*p1)[3] = &arr; // pointer to array (of 3 ints) 
int *p2 = arr;  // pointer to int 

p1是指向阵列(3个整数),然后初始化为指向arrp2是一个指向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]