为啥打印 char* 会给出字符串而不是地址? [复制]

Posted

技术标签:

【中文标题】为啥打印 char* 会给出字符串而不是地址? [复制]【英文标题】:Why does printing a char* give a string rather than an address? [duplicate]为什么打印 char* 会给出字符串而不是地址? [复制] 【发布时间】:2016-03-19 18:10:12 【问题描述】:

我正在学习学习 C++ 的基础知识,但是在尝试破译以下关于字符和指针的内容时,我总是碰壁。包括 line cmets,让我目前了解正在发生的事情。鉴于我有如下代码:

    using namespace std;
    int main()
    
          //String literal is an array of chars
          //Array address gets assigned to a ptr of char
          char myletters[] = 'h','i';
          char* lp = myletters;
          cout << *lp << endl;

          //Logically equivalent to above statements
          char* letters2 = "hi";
          cout << *letters2 << endl;

          //String literal turns into array of chars
          //Array of chars gets assigned to a ptr of chars 
          //Each ptr of chars gets stored into letters array
          char* letters[] = "hi","hello";
          cout << *letters << endl;   
    

我的输出将是:

h
h
hi

我的问题是:当我使用final cout打印*letters的内容时,为什么我得到的是字符串“hi”而不是“hi”的地址或者“hi”中第一个字符的地址?我知道 cout 的第一个用途是打印一个 char,最后一个 cout 是打印一个 char*,但我仍然想知道为什么它打印完整的字符串而不是我通常期望的指针的地址。

非常感谢。

【问题讨论】:

operator&lt;&lt;()char* 有一个特殊的重载。 @πάνταῥεῖ 你应该这样回答,因为那就是的答案。 所有字符串函数都对字符串指针起作用。如果您需要一个内存位置,请将指针转换为 long (long)stringPtr @ArifBurhan - 将其转换为 void*。不能保证long 大到足以容纳地址。 【参考方案1】:

&lt;&lt; 运算符对char* 有一个特殊定义,它会打印它所引用的 C 字符串。

在您的情况下,*letters 具有 char* 类型(作为字母 a char*[],与 char** 相同)而不是 char,因为 *lp 具有。

【讨论】:

我要补充一点,要打印地址,您只需转换为 void* 以便不再使用 const char * 的重载:cout &lt;&lt; static_cast&lt;void*&gt;(*letters) &lt;&lt; endl;

以上是关于为啥打印 char* 会给出字符串而不是地址? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥打印 unsigned char 有时有效,有时无效?在 C 中

为啥将字符串作为文件名而不是 char* 传递时出现错误?

为啥在 C++ 中更喜欢 char* 而不是字符串?

C++中cout<<字符数组名;为啥能输出字符串?

ANSI C:为啥字符函数接受 int 参数而不是 char 参数?

为啥 putchar、toupper、tolow 等采用 int 而不是 char?