iT邦幫忙

1

陣列名稱與指標問題

  • 分享至 

  • xImage

最近在讀指標時發現書上寫
「陣列名稱是一個存放位置的指標常數,它指向陣列的位置」
還有這個指標常數的值,會等於他的位址(譬如一個陣列名為a,那a就是一個指標常數,並且a的值跟會等於&a)

但是我寫了一個小程式測試一下:
int a[5];
int* p=a;
int (*q)[5] = &a;

這個程式是合法的,也就是說,a應該是某個整數的位置(所以才能assign給int* p)
而&a應該是陣列的位置(所以才能assign給int (*q)[5])

這跟書上寫的好像不一樣,到底是怎麼一回事呢?
求解惑~

meebox iT邦新手 3 級 ‧ 2023-12-23 09:07:19 檢舉
提供給你參考 https://dev.to/codemee/c-yu-yan-de-zhen-lie-yu-zhi-wei-qi-pointer-2ikm
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
skycat2216
iT邦新手 5 級 ‧ 2023-12-23 04:13:12

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)

謝謝您!

1
meebox
iT邦新手 3 級 ‧ 2023-12-23 09:08:00

謝謝您!

1
海綿寶寶
iT邦大神 1 級 ‧ 2023-12-23 10:33:38

簡單說
一般變數a是值,&a是位址/指標
而在此題的情境(陣列a[5]),此時 a=&a

詳如下圖
參考看看

https://ithelp.ithome.com.tw/upload/images/20231223/20001787rLzW7GKa5M.png

另外提醒一點
要小心這句話

這個程式是合法的

在C/C++的世界裡
合法不代表正確
看上圖中可以隨意存取(*q[5])就知道了

"合法不代表正確"
No Diganostic Required跟Undefine behavoiur是吧?

謝謝您!

我要發表回答

立即登入回答