我很新的指針的概念,最近遇到這行代碼來: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