【C++】之前学习C++没有注意到的点或者学到了冷知识(待补充)
2024-10-21 15:56:35
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;
最新文章
- ASP.NET c# textbox 正则表达式 文本框只允许输入数字(验证控件RegularExpressionValidator )
- [原创]mac终端前面的计算机名怎么改??
- AD RMS Bulk Protection Tool 批量加密解密office文档
- 格式化格林威治时间(Wed Aug 01 00:00:00 CST 2012)
- 工作中的趣事:聊聊ref/out和方法参数的传递机制
- 7_SQL Server通过代码删除数据
- [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&;&;安装eclipse
- 2018-2019-2 网络对抗技术 20165231 Exp2 后门原理与实践
- JS检测浏览器是否最大化
- python—正则表达式
- Vue项目打包常见问题整理
- Android开发环境搭建篇详尽的教程实例汇
- MySQL添加字段和修改字段
- Filter应用之-验证用户是否已经登录
- 关于AC自动机和DP的联系
- Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
- 训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?
- spring中scope的prototype与singleton区别
- HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)
- POJ 2182 Lost Cows (求序列第k大)