測驗代碼:
#include <iostream>
using namespace std;
int main()
{
const char* b="str";
cout << b << endl;
cout << *b << endl;
cout << &b << endl;
cout << *(&b) << endl;
return 0;
}
結果:
str
s
0x7ffdf39c27f0
str
我在 web runoob 在線編譯器上運行我的代碼
為什么我得到這些結果?我看了一些關于 char* 的問題,但不足以讓我理解。有人可以向我解釋一下嗎?圖片最好。
我想通過推薦的書籍或博客了解更多相關資訊。
順便說一句,使用char b[]而不是const char*,我得到了相同的結果。
非常感謝你們所有人。
我只想知道為什么 char 指標的值不是地址。
我認為地址就像 0x7ffdf39c27f0。一個記憶體地址。
但是const char* b = "str"。b 只是str.
我發現這*b與*("str").
所以我想知道記憶中發生了什么?為什么字符指標的值不是地址?
uj5u.com熱心網友回復:
要了解代碼輸出的內容,您需要了解 C 輸出流(具有諸如 型別的std::ostream物件),因此物件(例如std::cout)具有許多operator<<(). 呼叫的多載取決于提供的引數型別。
我將解釋您的第二個示例,但第一個示例的解釋幾乎相同。
const char* b="st\0r"; cout << b << endl; cout << *b << endl; cout << &b << endl; cout << *(&b) << endl;
cout << b擴展到cout.operator<<(b)哪里b有型const char *。運算子函式的多載假設引數指向以 nul 結尾的字串(的第一個字符),該字串在記憶體中表示為char以char帶值'\0'(零)結尾的陣列。運算子函式輸出它找到的每個字符,直到它到達一個'\0'字符。第一'\0'發現的是一個你后明確地插入't',因此,輸出st被產生。您的字串在'\0'之后有第二個這一事實'r'無關緊要,因為運算子函式在它找到的第一個函式處停止。
cout << *b擴展為operator<<()接受單個的不同多載的呼叫char,并輸出char. *b是由 表示的字串中第一個字符的值b。這樣s就產生了輸出。
在cout << &b,&b有型別const char ** or (等價)char const **。沒有operator<<()接受 a的輸出流的多載const char **,但有接受 a 的多載const void *。由于任何指標(指向成員的指標或指向函式的指標除外)都可以隱式轉換為void *,因此(由編譯器)執行該轉換,因此多載匹配并被呼叫。特定的多載會operator<<()列印記憶體中的地址。
第三種情況下的隱式轉換不會在前兩種情況下發生,因為不需要隱式轉換的呼叫比需要隱式轉換的呼叫更匹配。
在最后一條陳述句*(&b)中相當于b. 這是這種情況,因為&是此代碼中的取址運算子,而*是解參考運算子(它是取址運算子的逆運算)。所以最后一條陳述句產生與cout << b.
uj5u.com熱心網友回復:
cout << b << endl;
您正在列印字串 b
cout << *b << endl;
您正在列印指向b.的第一個字符的指標,因此與以下內容相同:
cout << b[0] << endl;
cout << &b << endl;
&b是 的記憶體地址b,表示要存盤b在計算機中的記憶體地址。
cout << &b << endl;
因此,您正在列印b此處的記憶體地址。計算機存盤b在記憶體地址中0x7ffdf39c27f0,這就是你得到的。
cout << *(&b) << endl;
您正在列印一個指向 的記憶體的指標b,因此您在變數的記憶體地址處列印值,該值b與
cout << b << endl;
編輯:一個指標包含一個地址(通常,它可以指向一個函式,例如)表示一個物件的位置,并且列印一個指標(通常)列印該記憶體地址的值。因為char *與以空字符結尾的字串密切相關,所以指向字符的指標有一個特殊的多載來列印指向的字串。
指標變數仍然是一個變數并且會有自己的地址,因此會&b產生一個指向指標的指標, char **在這種情況下是 a 并且因為它不再是 a char *,cout << &b;列印 的地址b,而不是指向的地址b或指向的字串b。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344546.html
上一篇:關于C 中運算子多載的困惑
