C++ char单引号vs双引号和内存内部工作

nic*_*ick 4 c++ iostream cout memory-address

我想知道程序在运行时在内存方面的作用,因为它遇到以下情况:

char chr = 'a';
char chrS[] = "a";
cout << "Address: " << &chr << endl;
cout << "Address: " << &chrS << endl;
Run Code Online (Sandbox Code Playgroud)

这产生以下结果:

Address: a?c?3?
Address: 0x7fff33936280
Run Code Online (Sandbox Code Playgroud)

为什么我不能得到"chr"的内存地址?

Pup*_*ppy 12

因为&chr产生一个char*(const这里隐式添加)并cout假设它是一个字符串,因此null终止,但它不是.

然而,&chrS产生a char(*)[],它不会衰减到a const char*,因此将通过operator<<(std::ostream&, const void*)重载输出,从而输出地址.

如果您想要这种行为,const char*则必须执行显式转换.C字符串和指向单个字符的指针之间没有区别这一事实是C字符串的主要缺陷之一.