看板 C_and_CPP 關於我們 聯絡資訊
(A) 請問以下的code: char s[11] = "0123456789" ; cout<< "(1) *(s+2) = "<< *(s+2) <<endl; cout<< "(2) *((long*)s+2) = "<< *((long*)s+2) <<endl<<endl; 我不懂 *((long*)s+2) 意思為??? ----------------------------------------------------- (B) struct AA { char a:1; char b:2; char c:3; }; 首先我沒看過char a:1 的這種寫法? 這是代表什麼意思 ? 還有為何 sizeof(AA) 會是1 ? ------------------------------------------------------ (C) int a[5] = {1,2,3,4,5}; int *p = *(&a + 1); 這裡我有點不解 &a 和 &a[0] 是相同的記憶體位置 (&a + 1) 我以為是 a 後面一格的記憶體位置(也就是 &a[1]) 但卻不是 我用devC++ 檢察反而是 a[5]的記憶體位置 ? 而a[5]的內容未定義 這我不大了解? ----------------------------------------------------------- 懇請賜教 ※ 編輯: caxz (60.245.65.182), 12/02/2014 18:17:38
johnpage: 1.遠程指標 12/02 18:20
johnpage: 2.bit的寫法,不足1byte,以1byte算 12/02 18:20
Killercat: 不是遠程指標 只是單純的long* 遠程指標是far 12/02 18:30
Killercat: 第一題我覺得你出去深呼吸兩下 喝個冰水回來就看懂了 12/02 18:31
Killercat: s是char* 硬轉成long*, +2代表移動兩個sizeof(long) 12/02 18:31
descent: c: 加整個 array size 12/02 18:32
Killercat: 最後再取值*(...) 這樣看懂了嗎? 12/02 18:33
Killercat: :1 :2有點太細,他是指定該變數吃幾個bit 12/02 18:34
Killercat: 以及怎麼排列,這個例子是POD,會按順序排列 12/02 18:34
caxz: 可是第一題*((long*)s+2) 的結果是14648 這又是為何? 12/02 19:42
dirkc: @caxz: 0x00003938 = 14648, 32位元long*等於4個byte, 所以 12/02 20:13
dirkc: *(long*)s=0x33323130, 0x30等於'0', 0x31等於'1',依此類推 12/02 20:14
dirkc: "0123"四個byte就變成0x30313233,little-endian就反過來 12/02 20:15
dirkc: 依此類推*((long*)s+2)指到最後"89\0",再多一個'\0'是湊巧 12/02 20:17
dirkc: 不過陣列宣告用堆疊記憶體,一般都會多配置空間,所以多'\0' 12/02 20:17
dirkc: 的湊巧幾乎總是會發生。 12/02 20:18
MIKEmike07: 哪間呀@@,不是頗簡單 12/02 20:46
dirkc: 另外一種想法是CPU賦值到記憶體還是以4或8bytes來對齊,所以 12/02 21:02
dirkc: 底層會多個'\0'是必然的。總之,大概是這些原因。 12/02 21:03
tsoahans: 3.指標加一是跳一整個a陣列的大小 前幾個禮拜版上有人問 12/02 21:58
ACMANIAC: 1.long size depends on system 12/02 23:08
ACMANIAC: 2.bit field 3.&a 的 type 是 int [5] 12/02 23:11
ACMANIAC: 講錯了,a 的 type 是 int[5] 所以 &a 是 int (*) [5] 12/02 23:19
ACMANIAC: 先讀熟 K&R 吧,還蠻基本的 12/02 23:21
littleshan: 第一題其實是 undefined behavior 12/03 01:39
Killercat: 因為endian的關係對吧,我之前漏了這點 XD 12/03 09:28
Killercat: 另外除了C出得還不錯以外 其他兩題都有點太魯小了 12/03 09:29
littleshan: 除了endian,直接cast指標可能違反alignment 12/03 12:42
dirkc: 有時候不大懂考偏冷寫法的考官動機是什麼 12/03 18:07
dirkc: 語法在那但是正常寫程式不會跟自己過不去 12/03 18:08
johnpage: 炫耀 12/04 05:34
johnpage: 只要能達到效果都是好程式,不需要寫成這樣 12/04 05:36
LPH66: 問題只在於有些寫法標準都告訴你不一定會達成效果 12/04 08:42
LPH66: 但一堆人還是寫的很高興... 12/04 08:42
wenyonba: C 的題目 int *p = *(&a+1) 是不是等於 int *p = a+1 12/04 17:54
purpose: 不是 12/04 18:05
Killercat: 要看a的type是什麼 12/04 18:11
Killercat: 精確地說 要看sizeof(a)是否等於sizeof(int) 12/04 18:12