首页 > 编程语言 >【C++】之前学习C++没有注意到的点或者学到了冷知识(待补充)

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

时间:2022-09-27 15:14:49浏览次数:60  
标签:学到 const string 指向 知识 C++ char str printf

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;

标签:学到,const,string,指向,知识,C++,char,str,printf
From: https://www.cnblogs.com/thankvincisdaily/p/16734594.html

相关文章

  • PCIE背景知识学习(6)
    PCIE背景知识学习(6)物理层物理层的LTSSM(LinkTrainingandStatusStateMachine,链路训练状态机)负责进行链路初始化以及训练。 为了更容易看出这个数据包是怎么构成的,......
  • PCIE背景知识学习(7)
    PCIE背景知识学习(7)每个PCIe功能(Function)的标识在其所在的设备内,以及这个设备所连接的总线内,都是唯一的。其标识符一般被称为“BDF”。   仔细看图中的总线序号,观察......
  • 从0开始的Axure学习(一)Axure的界面知识
    前言:1.作为一个测试人员,有时候在日常的工作中也需要针对产品的布局进行界面化测试,需要合理,正确的判断。2.想通过测试作为开始逐渐往产品或交互工程师等进行变化3.学习新......
  • C++模板的哲学
    2.5模板C++的模板一直是这门语言的一种特殊的艺术,模板甚至可以独立作为一门新的语言来进行使用。模板的哲学在于将一切能够在编译期处理的问题丢到编译期进行处理,仅在运......
  • 爬虫理论知识
    常用的请求方法(1)Get(2)Post(3)Put(4)Delete(5)Trace(6)Head(7)Connect(8)Options列举反爬虫机制(1)UA检测;UserAgent:实现UA伪装;Cookie:模拟登陆;Accept:接......
  • 月出の杂谈 | 热知识:在 SEU 开会可以去哪里
    空间预约:健雄书院预约系统只对吴院人开放,其他人可通过前台志愿者预约。秉文书院对全校开放(貌似?),需要提前一天预约。借教室需要提前两天申请。图书馆研讨间可以随......
  • 学习:网络基础知识 https安全性总结,http和https对比
    加密----秘钥;身份认证----证书(申请)==双向认证;完整性保护----哈希算法--计算一个hash值验证消息的完整性,对比客户端发来的摘要信息来对比自身计算的摘要信息保证数据没......
  • 学习:网络基础知识-Https协议详解
    HTTP协议问题:发送数据都是明文的;如果第三者窃听截取数据包伪装成客户端与服务器进行交互服务器没有认证机制来确定客户端的身份客户端也没有任何机制确认服务器的身份;没......
  • 学习:网络基础知识 HTTP协议之响应报文
    响应报文-服务器回应给客户端的报文响应行+响应头部+空一行(格式代表响应头部结束)+响应体(服务器真真要返回的页面内容)   可以百度HTTP状态码可以看到详细的介绍响......
  • 学习:网络基础知识 HTTP协议之请求报文
    HTTP协议和安全版HTTPS协议HTTP(HyperTextTransferProtocol)超文本传输协议HTTP协议是基于TCP协议默认端口是80功能:用来规定客户端和服务端的数据传输格式特点:基......