簡體   English   中英

理解'&'運算符

[英]Understanding the '&' operator

根據我對'&'運算符的了解,它返回內存中操作數的基址。

讓我們想象下面的場景(就像在我的機器上一樣):

  • sizeof(int)= 4個字節
  • sizeof(float)= 4個字節
  • sizeof(char)= 1個字節

現在,如果我寫這樣的東西:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM