You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于const char*指针修改指向字符串的原理及地址疑问

关于const char*指针的常见误区解析

核心概念澄清

const char*的定义是:一个可以修改的指针,它指向的是不可修改的字符(常量字符)。这里必须区分两个完全不同的地址:

  • 指针变量str自身的地址(用&str获取):这是变量在栈上的存储地址,一旦变量创建就固定不变。
  • 指针str指向的地址(直接用str获取):这是指针存储的目标地址,是可以修改的,也就是让指针指向另一个内存区域。

字符串字面量的存储逻辑

像"Hello World"这类字符串字面量,在程序编译阶段就会被存入只读数据段(比如Linux下的.rodata段),每个字面量都会占据一块独立的内存空间,拥有固定的地址,程序运行时只能读取,不能修改。

你的代码为什么合法?

看这段代码:

const char* str{"Hello World"};
str = "I change the pointer and in turns it changes the string, but not really.";
  • 第一行:把"Hello World"在只读数据段的首地址,赋值给指针变量str,此时str指向这个字面量的起始位置。
  • 第二行:把另一个字符串字面量"I change..."的首地址,重新赋值给str——这只是修改了str变量内部存储的地址值,让它指向了另一个只读数据段的字面量,完全没有修改任何字符串的内容,这完全符合const char*的规则(允许修改指针本身)。

和整数例子的区别

你的整数类比代码:

int number{3};
const int* p_number{&number};
*p_number = 4; // 编译报错

这里的操作是试图修改指针指向的内容(*p_number对应number的值),而const int*明确禁止修改指向的内容,所以报错。这和字符串例子里的操作本质不同:字符串例子是修改指针本身的指向,而不是修改指向的内容。

关于两次打印&str地址相同的疑问

看你补充的代码:

const char *str{"HelloWorld"};
std::cout << &str << std::endl;
str = "I create new string, but I get same address";
std::cout << &str << std::endl;

你打印的&str是指针变量str自身在栈上的地址,这个地址从变量创建开始就固定了,不管你给str赋值多少次新的地址,变量自身的存储位置都不会变。

如果想看到指针指向的地址变化,应该打印str本身(注意要转成void*避免被当成字符串输出):

const char *str{"HelloWorld"};
std::cout << (void*)str << std::endl; // 打印"HelloWorld"的地址
str = "I create new string, but I get same address";
std::cout << (void*)str << std::endl; // 打印新字符串的地址,和上面不同

内容的提问来源于stack exchange,提问作者Nathaniel Brochu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:24:24