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; 输出的不是指针的地址,而是指针指向的字符串内容 —— 因为 coutchar* 有特殊重载。

  • 虽然 p 是指针,但 coutchar* 不是当作“地址”,而是当作“C 风格字符串的起始位置”。

  • 所以它会输出 "Hello",直到遇到 '\0' 为止。

  • 这是 coutchar* 的特殊重载:

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])必须的类型转换,用来强制输出地址。

所以转换不是多余的,而是为了输出地址所必须的

 

posted @ 2025-06-14 20:26  ChuckLu  阅读(35)  评论(0)    收藏  举报