最近在讀指標時發現書上寫
「陣列名稱是一個存放位置的指標常數,它指向陣列的位置」
還有這個指標常數的值,會等於他的位址(譬如一個陣列名為a,那a就是一個指標常數,並且a的值跟會等於&a)
但是我寫了一個小程式測試一下:
int a[5];
int* p=a;
int (*q)[5] = &a;
這個程式是合法的,也就是說,a應該是某個整數的位置(所以才能assign給int* p)
而&a應該是陣列的位置(所以才能assign給int (*q)[5])
這跟書上寫的好像不一樣,到底是怎麼一回事呢?
求解惑~
WG21 N4713(ISO C++17最終草稿)是這麼寫的
7.2 Array-to-pointer conversion
An lvalue or rvalue of type “array of N T” or “array of unknown bound of T” can be converted to a prvalue of type “pointer to T”. The temporary materialization conversion (7.4) is applied. The result is a pointer to the first element of the array.
所以書上講的不準確,至少C++17會將Array跟Pointer做分別,而在
int (*q)[5] = &a;
時會基於(7.4)初始化一個臨時物件及一個指向它的將亡值(xvalue)
簡單說
一般變數a是值,&a是位址/指標
而在此題的情境(陣列a[5]),此時 a=&a
詳如下圖
參考看看
另外提醒一點
要小心這句話
這個程式是合法的
在C/C++的世界裡合法不代表正確
看上圖中可以隨意存取(*q[5])
就知道了