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

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

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

最后查看 str的内容变成”ttttt“
...全文
1631 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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"而已。
2024 年 Uber 乘车分析数据集 这个综合数据集包含 2024 年 Uber 运营的详细拼车数据,提供了有关预订模式、车辆性能、收入流、取消行为和客户满意度指标的丰富见解。 数据集概述 该数据集捕获了多种车辆类型的 148,770 个总预订,并提供了拼车作的完整视图,包括成功乘车、取消、客户行为和财务指标。 主要统计数据: 总预订量:148.77K 次乘车 成功率:65.96%(93K 完成骑行) 取消率:25%(37.43K 取消预订) 客户取消:19.15%(27K 乘车) 司机取消: 7.45% (10.5K 乘车) 数据模式 数据集包含以下列: 列名称 描述 Date 预订日期 Time 预订时间 Booking ID 每次行程预订的唯一标识符 Booking Status 预订状态(已完成、客户取消、司机取消等) Customer ID 客户的唯一标识符 Vehicle Type 车辆类型(Go Mini、Go Sedan、Auto、eBike/Bike、UberXL、Premier Sedan) Pickup Location 游乐设施的起点 Drop Location 乘车目的地 Avg VTAT 司机到达上车地点的平均时间(以分钟为单位) Avg CTAT 从取件到目的地的平均行程时间(以分钟为单位) Cancelled Rides by Customer 客户发起的取消标志 Reason for cancelling by Customer 客户取消原因 Cancelled Rides by Driver 驱动程序启动的取消标志 Driver Cancellation Reason 司机取消原因 Incomplete Rides 未完成骑行标志 Incomplete Rides Reason 不完整骑行的原因

65,198

社区成员

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

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