为什么const char * 的内容是可以更改的?

lee_kong 2017-07-25 06:43:28
vs 2015中如下代码

const char * str = "sssss";
str = "ttttt";

最后查看 str的内容变成”ttttt“
...全文
1394 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
唯恐天下不乱 2017-07-27
  • 打赏
  • 举报
回复
const只是编译期检查,实际没那么多限制
qq553823465 2017-07-27
  • 打赏
  • 举报
回复
std::cout<<str 你会发现其实是地址变了
赵4老师 2017-07-26
  • 打赏
  • 举报
回复
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
lee_kong 2017-07-26
  • 打赏
  • 举报
回复
引用 1 楼 xsklld 的回复:
这是指针的赋值,只是把str指向了新字符串"ttttt"而已。
我一直以为“tttttt”这个右值代表的仅仅是个值,没意识到其实根本来讲这个“ttttt“右值代表的是一个指针,一个地址, 这么说下来 那const char *的使用有何意义呢 本意是希望这个字符串不被改变,但事实上只有使用strcpy时const这个限制才管用!
xskxzr 2017-07-26
  • 打赏
  • 举报
回复
引用 6 楼 lee_kong 的回复:
[quote=引用 1 楼 xsklld 的回复:] 这是指针的赋值,只是把str指向了新字符串"ttttt"而已。
我一直以为“tttttt”这个右值代表的仅仅是个值,没意识到其实根本来讲这个“ttttt“右值代表的是一个指针,一个地址, 这么说下来 那const char *的使用有何意义呢 本意是希望这个字符串不被改变,但事实上只有使用strcpy时const这个限制才管用![/quote] 1、字符串字面值是左值,代表一个const char数组(C里是char数组)。用字符串字面值初始化(或赋值)const char*就相当于用一个const char数组初始化(或赋值)指针,会发生数组到指针的转换。 2、const char*的意思是你不能通过这个指针去改其指向的数组,指针本身的值可以修改。你要是想让指针本身的值也不能修改,就用const char* const类型。 3、C++11后char *str = "tttttt"是通不过编译的。
lee_kong 2017-07-26
  • 打赏
  • 举报
回复
引用 3 楼 fight_in_dl 的回复:
引用
最后查看 str的内容变成”ttttt“
const char * str = "sssss";  
//str是常量指针,即str指向的对象"sssss"字符串是常量。
*str = 'w'  //错误,不能试图通过str指针改变字符串"sssss"。
str = "ttttt"; //正确,常量指针可以指向别的内存(对象)
对应还有一个概念是指针常量,即指针自身不可变,但其指向的地址的内容是可以被修改的。 推荐这篇博客,讲解简明清晰,希望对你有帮助。 http://6924918.blog.51cto.com/6914918/1267052
我理解你说的意思,str的 类型 是 const char *,其指向内容不可更改,是一个左值, 所以我觉得我理解错误在,没理解“ttttt”这个右值代表的是一个指针,我一直把“ttttt“理解为一个类似于整型1、2、3这样的值类型, 那么我觉得const chat *的存在有何意义呢? 例如 void foo(const char * str) { str = ”ssssss“; cout<<str<<endl; } void foo1(char * str) { str = ”ttttt“; cout<<str<<endl; } void main() { const char * str1 = "hello"; foo(str1); //在函数foo里依然会输出 ssssss,但在下方输出str1时 ,str1的值没有被改变,依然是hello, //这种用法str1指向的内容没有被改变 //我的理解是 在函数中foo之中 str1这个指针作为foo函数参数传递时,在foo函数内部的复制了一个 //str指针的临时指针对象, //这个临时字符串指针在函数运行时被指向ssssss //这个临时指针对象,在函数退出之后,foo函数堆栈的内容被销毁,临时指针被销毁 cout<<str1<<endl } 输出: sssss hello foo函数参数的const本意是不希望这个str的内容不被改变,但在函数内部依然被改变了 实际上只有使用strcpy时,这个限制才存在 那么const char *的存在有何意义?
赵4老师 2017-07-26
  • 打赏
  • 举报
回复
引用 8 楼 lee_kong 的回复:
[quote=引用 7 楼 zhao4zhong1 的回复:] 不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
恩,我是在看一段代码的时候,意识到这个问题的,一直以为对const已经算是掌握了,其实根本没有[/quote] 我的意思是“常量”和变量没有本质区别,不需要掌握。
lee_kong 2017-07-26
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
不要纠结各种常量了,这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢!
恩,我是在看一段代码的时候,意识到这个问题的,一直以为对const已经算是掌握了,其实根本没有
starytx 2017-07-25
  • 打赏
  • 举报
回复 1
const char * ss= "xxxxxx"; // 这个表示的是指针指向的内容不可修改 char * const ss = "xxxxxx"; // 这个表示这是一个指针常量,再不能指向其他地址,比如ss= ...是不允许的 const char * const ss ="" ; // 这个就是指针不可修改,指向的内容也不可以修改
战在春秋 2017-07-25
  • 打赏
  • 举报
回复
引用
最后查看 str的内容变成”ttttt“
const char * str = "sssss";  
//str是常量指针,即str指向的对象"sssss"字符串是常量。
*str = 'w'  //错误,不能试图通过str指针改变字符串"sssss"。
str = "ttttt"; //正确,常量指针可以指向别的内存(对象)
对应还有一个概念是指针常量,即指针自身不可变,但其指向的地址的内容是可以被修改的。 推荐这篇博客,讲解简明清晰,希望对你有帮助。 http://6924918.blog.51cto.com/6914918/1267052
jena_wy 2017-07-25
  • 打赏
  • 举报
回复
指针常量与常量指针的问题
xskxzr 2017-07-25
  • 打赏
  • 举报
回复
这是指针的赋值,只是把str指向了新字符串"ttttt"而已。

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧