c++ cout char*
#include <iostream>
using namespace std;
int main()
{
char *p = "Hello";
cout << *p << endl;
cout << *(p + 1) << endl;
cout << p <<endl;
char array[] = "Hello";
cout << array << endl;
cout << *(array + 1);
return 0;
}
p不是指针吗?输出p不是应该输出H的内存地址吗
这个问题非常好,触及了 C++ 中 cout 对不同类型的 重载处理机制。关键在于:
cout << p;输出的不是指针的地址,而是指针指向的字符串内容 —— 因为cout对char*有特殊重载。
-
虽然
p是指针,但cout看char*不是当作“地址”,而是当作“C 风格字符串的起始位置”。 -
所以它会输出
"Hello",直到遇到'\0'为止。 -
这是
cout对char*的特殊重载:
ostream& operator<<(ostream&, const char*);
char* 是唯一被 cout 特别处理的指针类型,它不显示地址,而是显示它指向的字符串内容。
char array[] = "Hello";
cout << array << endl;
cout << *(array + 1);
cout << "数组首地址(array): " << static_cast<void *>(array) << endl;
// 打印每个字符的地址和内容
for (int i = 0; i < sizeof(array); ++i)
{
cout << "array[" << i << "] = '" << array[i] << "'"
<< " 地址: " << static_cast<void *>(&array[i]) << endl;
}
❌
&array[i]直接输出时会被解释为char*字符串,从而输出内容而非地址。
✅static_cast<void*>(&array[i])是必须的类型转换,用来强制输出地址。
所以转换不是多余的,而是为了输出地址所必须的。

浙公网安备 33010602011771号