1.string和c_str()

string str = "hello";
const char* cstr = str.c_str();
str = "yep,i m";

本来是以为str.c_str()会把str中包含的字符串在内存中开辟一个新空间存放进去,然后由cstr指向(现在怎么想都不合理,因为调用n次c_str就创建n个拷贝的话,它没有回收是有很大问题的),但是实际上cstr指向的是str的首地址:

string str = string("hello");
const char* c_s1 = str.c_str();
const char* c_s2 = str.c_str();
printf("%x\n",&str); //e3fa1c
printf("%x\n",c_s1); //e3fa1c
printf("%x\n",c_s2); //e3fa1c
str = "ddd...ddd"; //假设这里有1w个d
printf("%s\n", str); //1w个d
printf("%s\n", c_s1); //垃圾值
c_s1 = str.c_str();
printf("%s\n", c_s1); //1w个d
printf("%x\n",c_s1); //11f1fe8

当str的值发生小幅度变化时,cstr因为指向它也会发生变化,同理,当string为局部变量时,如果返回值为const char*的话,就会因为函数结束,string被回收而导致const char*指向一个垃圾值;

如果str的值发生了很大的变化的话,string是std的字符容器,进行扩容时就会把整个大字符串移动到某块内存,然后令自身指向那块内存,并且回收原来的内存,这样原先的const char*指向的空间就被回收了。

2.C++中去除const修饰

去除const修饰的方法不止一种,最简单的就是直接const_cast

string sstr = "hhhh";
const char* cstr = sstr.c_str();
char* str = const_cast<char*>(cstr);
str[1] = 'y';
cout<<sstr<<endl;
return 0;

当然,和C语言一样,一个char*指向一个const char*指向的地址并不意味着可以为所欲为,如果const char*指向的是字符串常量的话,char*指向它然后修改的话同样会产生段错误。

然后还有一个有趣的例子:

const int i = 0;
const int* pi = &i;
int& ret = const_cast<int&>(i);
cout << "i (" << &i << "):" << i << endl;
cout << "ret(" << &ret << "):" << ret << endl;
ret = 15;
cout << "i (" << &i << "):" << i << endl;
cout << "ret(" << &ret << "):" << ret << endl;

【C++】之前学习C++没有注意到的点或者学到了冷知识(待补充)的更多相关文章

  1. Linux学习笔记-林耐斯Notes-Linux就该这么学

    Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...

  2. 学习Spring必学的Java基础知识(2)----动态代理

    Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的 ...

  3. linux学习第十七天 (Linux就该这么学)

    今天12月14日学习比较少点,等了一会,主要讲了squid代理,1,正向代理 2反向代理 正向代表分为:标准的正向代理,透明的正向代理 ,这个比较实用, 还讲了RHCE考试的中的内容  iscsi 是 ...

  4. linux学习第十六天 (Linux就该这么学)

    今生讲了邮件的产生和解决和实际问题,把前两天的和这节邮箱系统统一布置,又统一复习和学习了一下,

  5. linux学习第三天 (Linux就该这么学)

    今天是学习的第三天,讲了很多命令,又赶上双11,网络经常波动,我经常掉线,没有听到多少,回头再看一下录播.我也写一下讲的命令吧,也加深一下命令的印象.第三章老师讲完了. ifconfig命令:输出信息 ...

  6. 主题:学习Spring必学的Java基础知识(9)----HTTP报文

    转: 引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓“登高必自卑,涉远必自迩”.以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系列分别介绍这些 ...

  7. Git学习笔记01--常用Git命令、cmd命令及Git总结性知识

    资源:外国网友制作的 Git Cheat Sheet 第二次学习廖雪峰老师的Git教程,学习过程中把教程中涉及到的Git命令及总结性知识记录下来方便二次复习. 知识点 所有的版本控制系统,其实只能跟踪 ...

  8. 从学习“单例模式”学到的Java知识:双重检查锁和延迟初始化

    一切真是有缘,上午刚刚看完单例模式,还在为其中的代码块同步而兴奋,下午就遇见这篇文章:双重检查锁定与延迟初始化.我一看,文章开头语出惊人,说这是一种错误的优化,我说,难道上午学的东西下午就过时了吗?仔 ...

  9. 大周末的不休息,继续学习pandas吧,pandas你该这么学,No.7

    其实,写文章真的挺难的 每天抽点时间,写写文采飘逸的文章 坚持个几年,成为称霸一方的大佬 坚持就会成功吧~ 最近碰到瓶颈了, 一直找不到好的运营公众号的方式(好想有人指导唉~,对了,橡皮擦有个100多 ...

  10. 云计算、大数据、编程语言学习指南下载,100+技术课程免费学!这份诚意满满的新年技术大礼包,你Get了吗?

    开发者认证.云学院.技术社群,更多精彩,尽在开发者会场 近年来,新技术发展迅速.互联网行业持续高速增长,平均薪资水平持续提升,互联网技术学习已俨然成为学生.在职人员都感兴趣的“业余项目”. 阿里云大学 ...

随机推荐

  1. JZOJ 4211. 【五校联考1day2】送你一颗圣诞树

    题目 解析 \(Code\) #include<cstdio> #include<map> #include<iostream> #include<cstri ...

  2. 英国学者在真实世界早期RA队列研究中发现较高比例的临床缓解患者仍存在能量多普勒超声活性

    标签: 类风湿关节炎; 目标治疗策略; 能量多普勒活性; 预测因子 英国学者在真实世界早期RA队列研究中发现较高比例的临床缓解患者仍存在能量多普勒超声活性 电邮发布日期:2016年4月6日 本研究的重 ...

  3. .net redis 发布订阅demo

    发布者: using StackExchange.Redis;using System; namespace publish{ class Program { static void Main(str ...

  4. 基于OpenGL绘制shp文件

    1. 引言 坐标数据是空间数据文件的核心,空间数据的数据量往往是很大的.数据可视化是GIS的一个核心应用,绘制海量的坐标数据始终是一个考验设备性能的难题,使用GPU进行绘制可有效减少CPU的负载,提升 ...

  5. 【译】.NET 7 中的性能改进(十)

    原文 | Stephen Toub 翻译 | 郑子铭 最后一个有趣的与IndexOf有关的优化.字符串早就有了IndexOf/IndexOfAny/LastIndexOf/LastIndexOfAny ...

  6. Linux——CentOS7无法ping通外网问题

    出现问题: 当在终端中出现 ping: unknown host www.baidu.com 或 ping: www.baidu.com: 未知的名称或服务 时,该如何解决? 解决方法: 1.使用ro ...

  7. 时间戳转换为yyyy-MM-dd格式

    原文链接https://blog.csdn.net/hu104160112/article/details/111167033

  8. Windows 11在使用AMD时,CPU占用率持续100%的解决方案

    一.现象 Windows 11在使用AMD时,CPU占用率持续100%,持续好几个系统版本都是如此 二.系统版本: 版本 Windows 11 专业工作站版版本 22H2安装日期 ‎2022/‎10/ ...

  9. 安全测试-WEB安全渗透测试基础知识(三)

    1.3. 域名系统 1.3.1. 域名系统工作原理 DNS解析过程是递归查询的,具体过程如下: 用户要访问域名www.example.com时,先查看本机hosts是否有记录或者本机是否有DNS缓存, ...

  10. (app笔记)Appium如何开启、配置、启用

    1.安装adb 2.打开手机调试 3.连接手机 4.appium运行前,手机需要io.appium.uiautomator2.server 和 Appium Settings. 5.appium操作: ...