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. dom添加样式可以这样写

    1.原生 js添加样式很多时可以合并在一起写: var oPopwin = document.getElementById('vpage'); oPopwin.style.margin = 'init ...

  2. addeventlistener可以这样表示

    事件绑定方法1: //找到id为category的div,绑定onmouseover事件 $("#category")[0].addEventListener("mous ...

  3. 通过反射机制简化 JDBC ResultSet 实体类的注入

    提出问题 查询完某个表之后,一般都是把结果的每一个字段注入到一个实体类中.比如,数据库 users 表,查询出来的结果注入到 User 实体类中. 通过 while 遍历 ResultSet,把字段对 ...

  4. Java/.Net双平台核心,Jvm和CLR运行异同点

    前言: 本篇以.Net 7.0.2 CLR 和 OpenJDk19参照,解析下它们各自调用函数的异同. 以下为个人理解. 概述 JDK大约5.9G,CLR大约7.6G,两者相差1.7G左右. root ...

  5. pat乙级1022 D进制的A+B

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #de ...

  6. APP压力稳定性测试-Monkey

    一.Monkey工具简介 1.monkey的来源: Monkey是一个命令行工具,使用安卓调试桥(adb)来运行它,模拟用户:触摸屏幕.滑动Trackball.按键等随机事件流来对设备上的程序进行压力 ...

  7. Vulnhub:recon靶机

    kali:192.168.111.111 靶机:192.168.111.188 信息收集 端口扫描 nmap -A -v -sV -T5 -p- --script=http-enum 192.168. ...

  8. C++程序设计实验五 模板类与多态

    三.实验内容 2. 实验任务2 Person.hpp: #ifndef PERSON_TASK_HPP #define PERSON_TASK_HPP #include<iostream> ...

  9. Monstache的安装和使用

    一.什么是Monstache Monstache 是Golang语言实现的基于MongoDB的oplog实现实时数据同步及订阅的插件,支持MongoDB与ES之间的数据同步.其中MongoDB需要搭建 ...

  10. 通过curl获取当前机器IPv6的外网地址

    curl -XPOST -vB -6 -g "https://10086.cn/web-Center/commonservice/getUserIp.do" -H "Re ...