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])
是必须的类型转换,用来强制输出地址。
所以转换不是多余的,而是为了输出地址所必须的。