Re: [轉錄]C語言的小問題
※ 引述《imbohn》之銘言:
: 題目:
: char ary[] = "ABC";
: char * ptr = "abc";
: char * pElement;
: char (* pWhole)[4];
: 1.
: ary寫法用了多少memory------->當然是 sizeof(ary),一共4 byte,因為還有\0。
: ptr寫法用了多少memory------->當然是 sizeof(char*)+sizeof("abc"),一共5個byte
: 。假設pointer用一個byte的話。
: 我的問題是:理論上操作ary的人,直接拿到ary,就是一個指向'A'的pointer,這是大家
: 都知道的。實作上,難道不需要一個存'A'位址的的地方?(沒修過compiler的報應出現)
: 我的猜想是,一個變數包括了 □□□ -> 型別/位址/值。應該array的型別和「操作」,
: 就帶有'A'位址的資訊,只是這個資訊,放在instruction/code memory裡面。
這是Compile time就能決定的事 在Run time沒必要再花空間去存它
注意ary的type其實是char [4]
在Compile time它的型別裡已經包含了容量的資訊
: 因此用ary[2] 和 用 *(ary+2)結果雖然相同,但前者或許省了一個tmp pointer的空間。
沒有
: 2.
: pElement = ary; 是否等義於 pElement = &ary[0]; ------>當然對。
: pWhole = &ary; !!! pWhole是指向整體ary[]的指標,而非指向'A',雖然一般都用指向
: 'A'來access。------->這是對的,只是指向整體arry似乎沒少有用武之處。
: pWhole = ptr;=========> 錯,因為型別不同,pWhole要指向一個4個元素的char array
: 。
: 問題來了,雖然,基本的操作是沒問題的,比方說。
: pElement+1 // 等同於 ary[1]
: pWhole又該如何?
: (*pWhole)[1] //是否等於 ary[1],應該是的,但是畫蛇添足。是嗎?
: pWhole+1 // 理論上應該不行,又好像可以,我目前任為是可以的。
可以,但是pWhole + 1一次會前進size of(ary) 而不是一個size of(char)
: pWhole除了確保指到的空間是4byte,「指到整體array」有好處嗎?什麼時候會指到
: 「整體array」?
pWhole隨時都會指向一個 char[4]
你甚至可以像下面這樣惡搞:
pWhole = (char (*)[8])&a[2];
^^^^^^^^^^^^^強制轉型是必要的
pWhole = &ary; // OK
pWhole = ary; // compile error!!
pWhole = &ary[2]; // compile error!!
更進階的惡搞
pWhole = &ary + 1 // OK,但是猜猜現在pWhole指向哪裡?
pWhole = &(ary + 1) // 猜猜看會不會過?
: 那反過來自問,把pElement的寫法,硬是轉回指到「整體array」可行嗎?如下
: (char [4] * )pElement,轉完之後,pElement就變成pWhole了?
(char (*)[4])才是正確的轉型
這樣單純就是從char*轉成 char (*)[4]的強制轉型
: 感恩。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.15.163
※ 編輯: holymars 來自: 114.32.15.163 (09/11 16:44)
推
09/11 17:25, , 1F
09/11 17:25, 1F
推
09/11 17:44, , 2F
09/11 17:44, 2F
→
09/11 17:46, , 3F
09/11 17:46, 3F
→
09/11 17:48, , 4F
09/11 17:48, 4F
→
09/11 17:49, , 5F
09/11 17:49, 5F
→
09/12 00:44, , 6F
09/12 00:44, 6F
→
09/12 00:50, , 7F
09/12 00:50, 7F
→
09/12 00:52, , 8F
09/12 00:52, 8F
→
09/12 00:52, , 9F
09/12 00:52, 9F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章