int main(int argc, char *argv[])
{
char b[]="Among Us";
char* string2 = &b[0];
printf("Print address of b\t\t= %p\n", &b[0]);
printf("Print content of string2\t= %p\n", string2);
printf("Print content of string2\t= %s\n", string2); // why ???
system("PAUSE");
return 0;
}
為什么最后一個printf向我們顯示b的內容?它不應該以%s 格式向我們顯示b的地址嗎?
我認為是通過string2printf("Print content of string2\t= %s\n", *string2);列印出 b 內容的正確方法,但顯然這是錯誤的方法。
uj5u.com熱心網友回復:
說明符%p和%s期望指標。
%p將列印指標的值。
但%s會使用char指標列印一個 C 字串,即由 .分隔的陣列'\0'。
如果你給*string2,它不是一個指標。它是指標指向的物件的值,在您的情況下是 a char。
將編譯器的警告級別提高到最大,并希望它足夠聰明,可以識別格式字串并檢查引數。
uj5u.com熱心網友回復:
printf("列印string2的內容\t= %s\n", string2);
即使之前沒有遵循運算子,也會列印整個字串string2,因為%s按照標準的定義,需要一個char *,即一個地址。
參考這里
uj5u.com熱心網友回復:
為什么最后一個 printf 會顯示 b 的內容?
陣列中第一個元素的地址是陣列本身的地址。=> 你也可以string2 使用b
編譯器運行后變數名不再存在,變數的程式關心地址
請參考:變數名如何存盤在 C 的記憶體中?
uj5u.com熱心網友回復:
你最好重溫一下你的 C 書的記憶體地址和指標一章。
假設您正在運行一個32 位系統,該系統使用4 個位元組尋址記憶體,并且代碼的記憶體狀態為:
// char array "b"
address value
======= =====
aaaa:0001 A // hex value 41
aaaa:0002 m // hex value 6d
aaaa:0003 o // hex value 6f
aaaa:0004 n // hex value 6e
aaaa:0005 g
aaaa:0006 // that's a "space" char, hex value 20
aaaa:0007 U
aaaa:0008 s
aaaa:0009 0 // that's a zero, hex value 00
// pointer "string2"
// pointing to "aaaa:0001"
// in reverse order
// depending on endianness of your system
address value
======= =====
ffff:0001 01
ffff:0002 00
ffff:0003 aa
ffff:0004 aa
- 您的第一個
printf將列印aaaa:0001為十六進制;即陣列的記憶體地址b。 - 您的第二個
printf將列印aaaa:0001為十六進制;即存盤在地址中的值ffff:0001通過ffff:0004。從格式說明符%p中,編譯器將知道它將列印一個記憶體地址并讀取 4 個位元組并在列印前恢復它們。 - 您的第三個
printf將列印Among Us;從格式說明符%s中,編譯器將知道它將列印一個字符陣列并在它指向的地址處列印字符,直到printf到達一個字串終止符,它是一個0.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444839.html
