iT邦幫忙

0

指向陣列的的指標使用取值運算子

  • 分享至 

  • xImage

int a[4]={1,2,3,4};
int (*p)[4];
p=&a;
cout<<sizeof(*p)<<endl<<*p<<endl<< *(*p);

上面這個c++ code的output是
16
某地址
1

p是一個指向四個元素的指標,所以*p應該就是整個a陣列,所以sizeof(*p)才會是4×4=16

但是為什麼cout<<*p 時出來的是一個地址呢?還有如果 *(*p) 的寫法是合法的(即可以對 *p 使用取值運算子),代表 *p 應該是一個地址,但 *p 應該是一個陣列才對呀...

還是這就只是個規則??我好困惑,求解,謝謝!

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
海綿寶寶
iT邦大神 1 級 ‧ 2024-01-17 07:50:20

所以
你沒看
上次的回答

/images/emoticon/emoticon06.gif

還有
p是一個指向四個元素的指標,所以*p應該就是整個a陣列
指標就是指標(位址), 不是「整個陣列」
頂多就是陣列的「起點位址」

看更多先前的回應...收起先前的回應...

有的!我有看上次的回答@@
不過這應該是不同的問題!?(應該吧..?
我的意思是 假設p是一個指向整數的指標
int a;
int* p=&a;
那麼 p 不就是a本身嗎?
所以如果p是一個指向陣列的指標
p就是那個陣列?
這樣的理解有錯嗎?@@

謝謝...

froce iT邦大師 1 級 ‧ 2024-01-17 10:34:55 檢舉
int* p=&a;

這句的白話就是 p這個「整數類型位址」是整數a的「起點位址」,並不是p就是a。

程式語言和一般的口語不同,細讀的時候不能省略太多,這樣你實際操作的時候會寫出很多問題。

學習的路很長很久,不要太快就下定論.
或是查看某些資料,然後變成一個定論記起來.
要試著先把一些基本的東西,輸出出來,多方驗證,一步步.
最好是能夠使用格式化輸出.做驗證比對.
https://cplusplus.com/reference/cstdio/printf/
發問程式碼要善用格式.

不好意思 發文的時候不知道為什麼把*吃掉了..
我寫的是 那麼 *p 不就是a本身嗎?
所以如果p是一個指向陣列的指標
那 *p就是那個陣列?

回覆 一級豬屠士 大大:
不好意思新手不太會用,下次會注意格式的!

frogsoul iT邦研究生 5 級 ‧ 2024-01-18 08:25:58 檢舉

*p 是 a
但a不是陣列本身
a本質上是一個指向陣列本體的指標

froce iT邦大師 1 級 ‧ 2024-01-18 09:11:47 檢舉

喔,我懂你的問題了。
p是一個指向陣列的指標,他是一個指標,有「自己」的值,這個值是陣列開頭地址,所以你用cout輸出的值也會是陣列開頭地址。
對p這個值標取值(*p),會得到陣列,也就是a,陣列用cout去輸出,你會看到的結果一樣是陣列開頭地址。
再取一次值 *(*p),才會得到陣列的第一個元素。

你多印一行你就會理解了

cout<<a<<endl<<&a<<endl<<p<<endl<<&p<<endl<<*p<<endl<<&*p<<endl;

你會看到a、&a、p、*p、&*p結果是一樣的,a和 *p 的記憶體位址都相同,表示它們是同一個東西,但p的記憶體位置不同,所以p不是同一個東西。

所以你的理解是對的。

謝謝force大大幫我釐清!
雖然不知道您會不會看到不過不好意思這麼晚回!

也謝謝frogsoul大大~

我要發表回答

立即登入回答