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

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

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

最后查看 str的内容变成”ttttt“
...全文
1390 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"而已。
​ 博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌项目名称基于Web的酒店客房管理系统的设计与实现系统说明3.2.1  用户模块功能分析前台模块应主要包括用户登录模块、用户注册模块、查看客房信息模块、客房预定 模块、用户留言模块、充值模块和个人信息维护模块。用户登录模块:用户通过输入注册的的账号和密码,然后进行身份验证,匹配成功 后实现登录功能。用户注册模块:用户输入合法的账号和密码可以实现注册功能。 查看客房信息模块:用户可以通过首页查看客房的价格,图片,详情等信息,从而   可以选择想要预定的房间。 客房预定模块:用户选择自己想要预定的客房后,可以通过输入相关信息进行订房操作。用户留言模块:用户可以向管理员发送留言。 充值模块:用户可以通过添加银行卡再为自己进行充值操作。 个人信息维护模块:用户可以修改自己的姓名、密码、身份证号等信息,还可以查看自己的订单。3.2.2  管理员模块功能分析对于管理员而言,一个好的管理系统总是能让酒店的管理工作事半功倍[7]。管理员 能够通过这个系统对自己的酒店情况一目了然,应该包括客户留言模块、客房管理模 块、订房信息管理模块、入住信息管理模块、统计分析模块、酒店新闻管理模块、会 员信息管理模块、员工信息管理模块、系统用户管理模块、个人信息维护模块。客户留言模块:管理员可以查看并回复用户的留言。客房管理模块:管理员可以管理客房信息,可以添加新的客房,删除已经停用的客房信息,还可以修改现有的客房信息。订房信息管理模块:管理员可以处理用户的订房请求,为用户办理入住手续。入住信息管理模块:对于没有注册的线下客户,也可以办理入住手续。统计分析模块:可以对酒店所有的入住信息进行记录和总结分析。酒店新闻管理模块:管理员可以更新网站上的新闻公告,展示图片等信息。会员信息管理模块:管理员可以查看到所有的注册会员信息,可以对会员信息进行删除,修改,添加操作。员工信息管理模块:管理员可以查看到自己公司所有的员工信息,而且还可以对员工的相关信息进行管理。系统用户管理模块:管理员可以查看到所有的系统管理员信息并对管理员信息进行管理。个人信息维护模块:管理员可以更改自己的登录密码或者是姓名、性别、手机号等 相关个人信息。​编辑 环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可4.硬件环境:windows 7/8/10 1G内存以上;或者 Mac OS; 5.数据库:MySql 5.7版本;6.是否Maven项目:否;技术栈1. 后端:Spring+SpringMVC+Mybatis2. 前端:JSP+CSS+JavaScript+jQuery使用说明1. 使用Navicat或者其它工具,在mysql中创建对应名称的数据库,并导入项目的sql文件;2. 使用IDEA/Eclipse/MyEclipse导入项目,Eclipse/MyEclipse导入时,若为maven项目请选择maven;若为maven项目,导入成功后请执行maven clean;maven install命令,然后运行;3. 将项目中springmvc-servlet.xml配置文件中的数据库配置改为自己的配置;4. 运行项目,在浏览器中输入http://localhost:8080/ 登录运行截图​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑​编辑 用户管理控制层:package com.houserss.controller;import javax.servlet.http.HttpSession;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import com.houserss.common.Const;import com.houserss.common.Const.Role;import com.houserss.common.ServerResponse;import com.houserss.pojo.User;import com.houserss.service.IUserService;import com.houserss.service.impl.UserServiceImpl;import com.houserss.util.MD5Util;import com.houserss.util.TimeUtils;import com.houserss.vo.DeleteHouseVo;import com.houserss.vo.PageInfoVo;/** * Created by admin */@Controller@RequestMapping(/user/)public class UserController if (ip != null && ip.length() > 0) String[] ips = ip.split(,);for (int i = 0; i  

64,675

社区成员

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

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