#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
a的值是514,但我不知道如何?!你能解釋下面的C代碼的輸出嗎?
#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
a的值是514,但我不知道如何?!你能解釋下面的C代碼的輸出嗎?
給定一個32位的2的補碼系統中,可變a
可以存儲在通過以下方式(十六進制):
02 01 00 00 // little endian, or
00 00 01 02 // big endian
你點在此整數的第一個字節,然後增加1指針。在一個小端系統中,您現在將指向值01
,在一個大端系統上,您現在將指向值00
。
看起來你有一個小端系統,因爲你將值01
更改爲02
並導致內存看起來像02 02 00 00
。這個翻譯爲十進制數會給你514
假設你是一個小端系統上工作:
int a = 258
它代表一個十六進制4字節數,0x00000102
char *b = &a;
做一個指向一個字節大小的數據類型,所以它只指向最後一個0x02
b++;
將指針1個字節,現在它指向0×01
*b = 2;
更改您的int從地址0x01爲0x02 現在你有a
a = 0x00000202 = 514
此答案假定整數存儲在[little endian](https:/ /en.wikipedia.org/wiki/Endianness)符號(這可能**是海報計算機上的實際字節順序,只要它們得到結果)。 – axiac
覺得作爲數組第二個字節字節(char
)與sizeof(int)
元素。
隨着
char *b = &a;
你讓b
指向此數組中的第一個元素。
然後你做b++
這使得b
指向第二個元素。然後給第二個元素賦值,這會修改a
的值。
另請注意,結果取決於您的系統的字節順序上的很。
258
看起來像00000000 00000000 00000001 00000010
(在小端)。
然後您將b
指向00000010
的「第一個char
」。
現在你增加b
,因爲它是char
型的,現在進入下一尋址char
這是00000001
(以下簡稱「第二」元素),然後將其更改爲2
這是00000010
。
所以現在我們有00000000 00000000 00000010 00000010
這是514
當作爲int
閱讀。
這個結果並不能保證,儘管在big-endian上結果會有所不同。
這個答案假定整數存儲在[little endian](https://en.wikipedia.org/wiki/Endianness)表示法中(這可能是**是發佈者計算機上的實際字節順序,給出結果他們得到)。 – axiac
[C++ *「proof」*](http://melpon.org/wandbox/permlink/FQhUdebvexmt5PkO) –
@axiac是的,我已經補充說明了,謝謝。 –
int a = 258;
假設int是4個字節長在你的機器,它會被存儲爲
00000000 00000000 00000001 00000010
當你這樣做char *b = &a;
,B將指向從右邊的第一個字節是00000010
當你做b++;
時,假設你的機器中char是1個字節,b值加1,現在它指向右邊第二個字節,即00000001.
現在你做*b =2;
。所以第二個字節將變成00000010
。
所以,如果你看到,a
,它會是這樣的。
00000000 00000000 00000010 00000010
哪個是512
整數型「B」變量的第二個字節將被增加作爲變量是字符類型的。您的答案將更改爲514
258 = 1 * 256 + 2. 514 = 2 * 256 + 2.您將1更改爲2 –