我無法理解從CCS C編譯器代碼。該代碼是:C指針嵌套
addr[0] = *(((char*)&block_number)+2);
我猜「&block_number
」被命名爲「段號」變量的地址。之後,我迷路了。
我無法理解從CCS C編譯器代碼。該代碼是:C指針嵌套
addr[0] = *(((char*)&block_number)+2);
我猜「&block_number
」被命名爲「段號」變量的地址。之後,我迷路了。
你是正確的。 & block_number是該變量的地址,並將其轉換爲char,並將值2添加到該值。例如,如果&段號是0×0000,則地址[0]執行行之後將包含0×0002,如果在平臺上的的sizeof(char)的爲2,或任何尺寸。
我們分了這件事:
*(ptr+2)
等同於:
ptr[2]
這裏,ptr
是指着block_number
地址的char*
。
所以說block_number
是這樣一個結構的實例:
struct {
char a;
char b;
char c;
char d;
} block_number
然後addr[0]
將包含c
值(假設值都擠滿了他們之間沒有空格)。這是因爲指針block_number
被轉換爲char*
,然後索引等的陣列。
因此,基本上,這個讀取block_number
第三個字節。
&block_number
是對象block_number
的地址。
(char*)&block_number
對待作爲第一元件的以字節爲單位的陣列的地址,解決。我們稱這個指針爲p
,它是一個指向char
的指針。
*(((char*)&block_number)+2)
因此是*(p + 2)
,它與p[2]
相同,即它表示陣列的第三個元素。
換句話說,你正在獲得對象block_number
的二進制表示的第三個字節(並存儲它addr[0]
)。
當人們不知道block_number是什麼時,有點難說。我們說,這是與價值0xdeadbeef
一個整數
unsigned int block_number = 0xdeadbeef;
在小端架構(即86):
*(char *)&block_number is 0xef,
*(((char *)&block_number) + 1) is 0xbe and
*(((char *)&block_number) + 2) is 0xad.
雖然如果段號是一個char
然後*(((char *)&block_number) + 2)
可以指向一個相鄰的可變,讓說段號是在堆棧上宣稱:
char a = 0xab, b = 0xbc, block_size = 0xcd, c = 0xde, d = 0xef;
然後((char *)&block_size + 2
可以指向即a
和*(((char *)&block_size + 2)
將返回0xab
。因爲棧是最常見的從最高地址責令低位地址:
heap stack
[... -> <- d | c | block_size | b | a ]
[... -> <- 0xef | 0xde | 0xcd | 0xbc | 0xab ]
但是,這是從來沒有一定的C沒有把任何約束編譯器在哪裏可以找到a
和位置可能是不確定的。
對於sizeof(char)
它是總是1
。 char
是一個字符,這就是爲什麼如果你想分配內存你不需要指定length * sizeof(char)到malloc。你只做:
int length = 20;
void *mem = malloc(length);
或者它可能是0x0004如果的sizeof(char)的是2 –
@AdrianGrigo:這是不可能的,根據定義。 –
自從我第一次回答這個問題以來,這個問題已經發生了變化。現在它將block_number [2]的值放在addr [0]處,而它最初是放置地址(它沒有意義,但那是代碼)。 –