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 應該是一個陣列才對呀...
還是這就只是個規則??我好困惑,求解,謝謝!
所以
你沒看
上次的回答
囉
還有p是一個指向四個元素的指標,所以*p應該就是整個a陣列
指標就是指標(位址), 不是「整個陣列」
頂多就是陣列的「起點位址」
有的!我有看上次的回答@@
不過這應該是不同的問題!?(應該吧..?
我的意思是 假設p是一個指向整數的指標
int a;
int* p=&a;
那麼 p 不就是a本身嗎?
所以如果p是一個指向陣列的指標
那p就是那個陣列?
這樣的理解有錯嗎?@@
謝謝...
int* p=&a;
這句的白話就是 p這個「整數類型位址」是整數a的「起點位址」,並不是p就是a。
程式語言和一般的口語不同,細讀的時候不能省略太多,這樣你實際操作的時候會寫出很多問題。
學習的路很長很久,不要太快就下定論.
或是查看某些資料,然後變成一個定論記起來.
要試著先把一些基本的東西,輸出出來,多方驗證,一步步.
最好是能夠使用格式化輸出.做驗證比對.
https://cplusplus.com/reference/cstdio/printf/
發問程式碼要善用格式.
不好意思 發文的時候不知道為什麼把*吃掉了..
我寫的是 那麼 *p 不就是a本身嗎?
所以如果p是一個指向陣列的指標
那 *p就是那個陣列?
回覆 一級豬屠士 大大:
不好意思新手不太會用,下次會注意格式的!
*p 是 a
但a不是陣列本身
a本質上是一個指向陣列本體的指標
喔,我懂你的問題了。
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大大~