C++指针能否存储字符串?新手对char*赋值写法的困惑
关于
char* str = "Hello"的困惑解答 嘿,这个问题太典型了——刚摸C++指针的时候,几乎所有人都会在这里打个问号,我当初也盯着这个写法愣了好久!别担心,其实核心逻辑还是你一开始理解的:指针永远只存储地址,根本不可能直接存下整个字符串,这个写法只是看起来像把字符串赋值给指针而已,背后藏着你没注意到的细节:
- 首先得搞懂
"Hello"是什么:它是一个字符串字面量。当你的程序编译运行时,这个字符串会被放在内存的只读区域(通常是数据段)里,它的实际形态是连续的6个字节:'H'、'e'、'l'、'l'、'o',再加上字符串结束标志'\0'(用来告诉程序“字符串到这就结束了”)。 - 然后看
char* str = "Hello"这个语句:它真正做的事情,是把这个字符串字面量的第一个字符(也就是'H')的内存地址赋值给指针str。指针str本身只是个小变量,大小就是你系统的地址长度(比如64位系统里是8字节),连"Hello"的一个字符都存不下,更别说整个字符串了。 - 补充个小提醒:现在C++标准其实不推荐直接用
char*指向字符串字面量,因为字符串字面量是只读的,如果你不小心通过str去修改它(比如str[0] = 'h'),会触发未定义行为。正确的写法应该是const char* str = "Hello",明确告诉编译器这个指针指向的内容不能被修改。 - 最后再帮你理清为什么打印
str会输出整个字符串:当你用cout << str或者printf("%s", str)的时候,这些函数看到char*类型的变量,会自动从它指向的地址开始,逐个读取字节,直到遇到'\0'才停止——不是指针里存了字符串,是它指向了字符串的起点,函数帮你把整个字符串读出来了。
你可以对比一下栈上的数组写法:char str[] = "Hello",这时候才是把"Hello"的内容复制到栈上的数组里,和指针的逻辑完全不一样哦!
内容的提问来源于stack exchange,提问作者DCochicho
相关产品推荐
相关产品推荐

