为何在该函数中无需解引用const char*类型指针?
为什么
const char*直接用cout输出是完整字符串而非地址? 这是因为C++标准库的std::ostream(std::cout是它的实例)对const char*类型做了特殊重载:它不会把这个指针当作普通内存地址输出,而是默认将其识别为C风格字符串的起始地址——从指针指向的位置开始,连续输出字符,直到遇到字符串结束符\0为止。你传入的"Hello"是字符串字面量,编译器会自动在它的末尾添加\0,所以cout能完整输出整个字符串。
而当你解引用const char* msg时,*msg的含义是访问指针直接指向的单个内存单元,也就是字符串的第一个字符'H',所以只会输出这一个字符。
如果要验证普通指针的行为,可以对比int*的情况:
#include <iostream> int main() { const char* str = "Hello"; int num = 42; int* p_num = # // 输出完整字符串Hello std::cout << str << std::endl; // 输出第一个字符H std::cout << *str << std::endl; // 强制转换为const void*,输出str的内存地址 std::cout << static_cast<const void*>(str) << std::endl; // 输出int指针的内存地址 std::cout << p_num << std::endl; return 0; }
如果确实需要输出const char*的内存地址,你需要把它强制转换为const void*——ostream对void*的重载逻辑是输出指针的内存地址,而非字符串。
简单总结:你之前的误解是把const char*等同于普通指针,但C++为了兼容和方便处理C风格字符串,给cout做了特殊处理;而解引用指针本来就只会获取它指向的第一个元素,所以得到单个字符。
内容的提问来源于stack exchange,提问作者Squiggles
相关产品推荐
相关产品推荐

