所以我的代碼片段是這樣的
char* ptr = "Hello";
這里ptr指的是什么?我認為它指向“H”。
為什么這個指標的ptr行為不像普通指標?
因為當我寫的時候printf("%s" ,*ptr),它沒有給我值,而是引發了一個錯誤。然而,當我寫printf("%s" , ptr)它時,它給了我“你好”作為輸出。
為什么會發生這種行為?
指標中實際存盤了ptr什么?
uj5u.com熱心網友回復:
您在這里的核心誤解可能是您認為“字串”是您可以在程式中傳遞并使用的東西,就像您可以使用 int、float 或結構一樣。當你試圖寫
printf("%s", *ptr);
也許你認為那ptr是一個指標,但你不想列印指標,你想列印指標指向的整個字串,所以你把它*放在那里“獲取指標的內容”。
您的推理中的缺陷在于,在 C 中,沒有字串這樣的東西,您可以將其作為一個整體傳遞printf給它以進行列印。
C 確實有字串,當然,但它們是作為陣列實作的。陣列是 C 語言中的二等公民:你絕對不能像使用整數、浮點數和結構體那樣傳遞它們并使用它們做事情。
每當您嘗試對陣列做某事時,您得到的(無論您是否想要,無論您是否意識到)都是指向陣列第一個元素的指標。
因此,即使我們說的%s格式printf是列印“的字串”,什么printf也沒有想到的是,你將整個字串傳遞給它-因為printf的知道你有沒有這樣做的方式。因此,%s格式 inprintf期望接收指向 string 中第一個字符的指標。
uj5u.com熱心網友回復:
所以我的代碼片段是這樣的
char* ptr = "Hello";這里
ptr指的是什么?我認為它指向“H”。
ptr指向char包含字符 'H'、'e'、'l'、'l'、'o'、'\0'的六元素陣列的第一個字符。具體char存盤在ptr指向的位置是'H'。請注意,這與string 不同"H"。
為什么這個指標的
ptr行為不像普通指標?
它的行為與任何其他char指標完全一樣,但有一個警告(您沒有練習過):因為它指向字串文字中的一個字符,所以您不能嘗試使用它來修改該字符或文字中的其他字符。
因為當我寫的時候
printf("%s" ,*ptr),它沒有給我值,而是引發了一個錯誤。
嗯,是的,這是合理的,雖然你不能依賴這里的錯誤。當你撰寫這樣的虛假代碼時,你可能會得到奇怪的行為。甚至是看似正常的行為。
如果您想列印一個char到ptr直接點,那么正確的格式設定指令是%c:
printf("%c" ,*ptr); /* *ptr is a char, not a pointer to one */
然而,當我寫
printf("%s" , ptr)它時,它給了我“你好”作為輸出。
%s另一方面,該指令期望它的引數是指向字串第一個字符的指標(ptr確實如此),并列印整個指向的字串。
為什么會發生這種行為?
因為那是應該發生的事情。目前還不清楚你為什么期望別的東西。
指標 ptr 中實際存盤了什么?
字串文字的第一個字符的地址"Hello"。
uj5u.com熱心網友回復:
char *ptr = "Hello";
ptr 指著 H
H 是一個字符。
所以你需要 -printf("%c", *ptr);只列印字符。這與printf("%c", ptr[0]);
顯然%s是一個字符陣列,因此%s將列印整個字串。
uj5u.com熱心網友回復:
它與char*指向的內容無關。函式族的%s說明符printf被簡單地定義為期望以空字符結尾的字符陣列作為引數。
printf("%s" ,*ptr) 是一種未定義的行為,任何事情都可能發生。
指標 ptr 中實際存盤了什么?
字串文字/字符陣列的地址"Hello",位于只讀記憶體中。或者該陣列的第一項,如果你愿意,相同的地址。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314970.html
下一篇:這個擦除鏈表的功能是否正確?
