Re: [轉錄]C語言的小問題

看板C_and_CPP (C/C++)作者時間16年前 (2009/09/11 16:32), 編輯推噓2(207)
留言9則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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
pWhole = (char (*)[8])&a[2];的8是否應該改成4呢?
09/11 17:44, 2F

09/11 17:46, , 3F
pWhole = &ary + 1 為ary之後的第一個4 Byte的位址
09/11 17:46, 3F

09/11 17:48, , 4F
pWhole = &(ary + 1)我覺得從type char*取址並非char *[4]
09/11 17:48, 4F

09/11 17:49, , 5F
應該是type不match,我猜的,還敢望大大指導,○rz
09/11 17:49, 5F

09/12 00:44, , 6F
啊對 應該是(char (*)[4])&a[2] XD
09/12 00:44, 6F

09/12 00:50, , 7F
其他的你都說對了 其實簡單的記法就是要記住T[n]這種
09/12 00:50, 7F

09/12 00:52, , 8F
Type在作operator + -和operator []傳回的型別是T*和T就
09/12 00:52, 8F

09/12 00:52, , 9F
萬事大吉了~
09/12 00:52, 9F
文章代碼(AID): #1AgWicOV (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1AgWicOV (C_and_CPP)