[英]Understanding the '&' operator
根據我對'&'運算符的了解,它返回內存中操作數的基址。
讓我們想象下面的場景(就像在我的機器上一樣):
現在,如果我寫這樣的東西:
void main() {
int i = 5411;
int *ip = &i;
char *c = &i;
printf("%d",*ip);
printf("%c",*c);
}
第一個printf()應該給我5411.談到第二個printf(),i的基地址包含10101001(高階8位= 1字節用於char類型指針)。 因此* c應該給我169,轉換為%c時是無效字符。
但編譯器給了我'#'或其他一些有效的輸出。 為什么會這樣? 有什么投入?
編輯 (取自作者對其中一個答案的評論):
那只是一個虛擬案例,因為我離開了實際的機器。
實際情況是i = 5411
您似乎無法理解整數如何存儲在內存中。 以5411為例。
5411 = 1010100100011
但是,這個13位二進制數字,因為int
是32位,所以它必須填充到32位
5411 = 00000000 00000000 00010101 00100011
在一個小端機器上(默認情況下為x86,ARM),最低有效字節存儲在前面,因此在內存中:
00100011 00010101 00000000 00000000
^
c c + 1 c + 2 c + 3
ip
因此, *c
應返回00100011,即35( '#'
)。
ASCII只定義了最多127個字符。除此之外,你真正想做的是打印與*c
的值對應的數字,這也是使用%d
來完成的...
printf("%d",*c);
...應該顯示您期望的數字。
首先,你的程序是不正確的。 C和C ++都不允許使用int *
值初始化char *
指針。 在初始化c
指針時需要顯式轉換。
其次,原始整數i
哪個字節 - 更高階或更低階 - 駐留在其“基地址”是實現定義的。 有小端架構,其中較低階但通過*c
(在8位char
機器上具有值130
,而不是114
)可以看到。 並且有大端架構,其中高階但通過*c
(在8位char
機器上為0
可以看到。 因此,您應該期望使用代碼130
字符或使用代碼0
字符使用%c
格式說明符進行打印。
第三,在典型的實現中,通常沒有諸如“無效字符代碼”之類的東西。 對於任何代碼,通常會以某種方式打印某些代碼。 我不知道你是如何設法獲得#
作為代碼的輸出。 這是你運行的真實代碼嗎?
* c的地址是i的地址,因為您已將c分配給&i。 然后它將取最高或最低(取決於endian)並打印該字符。
只是為了了解整數的編碼,你應該嘗試一下並做
printf("0x%X, %X|%X|%X|%X\n",
i,
i & 0xFF,
(i >> 8) & 0xFF
(i >> 16) & 0xFF
(i >> 24) & 0xFF
);
然后使用c[0]
, c[1]
等以及其他格式字符串作為%c
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.