char * 和 std::string
1 char * 和 std::string 的区别char * 字符串是常量字符串不能修改std::string 指向的字符串可以修改实例代码如下图所示s1 和 s2 均是常量字符串字符串常量保存在只读数据区是只读的不能写代码中注释的那两行代码会导致段错误。s3 是字符数组字符数组是可以修改的std::string 类型的字符串也是可以修改的。#include stdlib.h #include stdio.h #include iostream #include string #include cstring int main() { char *s1 hello; char *s2 hello; char s3[] hello; std::string s4 hello; printf(s1 addr %p, s2 addr %p, s3 addr %p, s4 addr %p\n, s1, s2, s3, s4.c_str()); printf(sizeof(s1) %d, sizeof(s3) %d, sizeof(s4.c_str()) %d\n, sizeof(s1), sizeof(s3), sizeof(s4.c_str())); // s1[1] a; // s2[1] a; s3[1] a; s4[1] a; std::cout s1 s1 , s2 s2 , s3 s3 , s4 s4 std::endl; return 0; }代码运行之后可以看到 s1 和 s2 是常量字符串这两个指针指向的地址也是相同的。从 s1s2 的地址和 s3s4 的地址对比可以看出s3 和 s4 的地址相距比较近和 s1、s2 的地址相距比较远。s1、s2 和 s3、s4 保存的段都不一样前者保存在只读数据段后者保存在栈所以地址差距才会大。sizeof一个char*类型就是指针的大小在64位系统上是832位系统上是4sizeof s3返回的是一个数组的大小数组的大小就是这个数组所占的空间包含了字符串结尾的\0。strlen是纯字符串的长度不包含字符串结尾的\0。2 std::string 是深度拷贝如下图所示 有 3 个字符串s1、s2 和 s3。s2 是基于 s1 通过拷贝构造而来将 s2[1] 赋值为 a然后打印 s1 和 s2s1 仍为 hellos2 为 hallo说明 s1 和 s2 相互不影响是深拷贝。s3 被 s1 赋值将 s3[1] 赋值为 m然后打印 s1 和 s3s1 仍为 hellos3 为 hmllos1 和 s3 相互没有影响。#include iostream #include string int main() { std::string s1 hello; std::string s2 s1; std::cout 1, s2 s1 std::endl; s2[1] a; std::cout 2, s2 s2 , s1 s1 std::endl; std::string s3 aaa; s3 s1; std::cout 1, s3 s3 std::endl; s3[1] m; std::cout 2, s3 s3 , s1 s1 std::endl; return 0; }运行结果如下3 std::string capacity如下代码声明了一个空字符串 s1打印出来了 s1.capacity是 15也就是说 std::string 默认就会有 15 的空间。通过这样预申请空间的方式避免了小字符串申请内存也是一种用空间换时间的方法。如果字符串的大小不大于 15就不会申请堆空间如下代码可以验证。执行结果使用 gdb 调试对 malloc 设置断点可以查看上边的代码哪一行调用了 malloc()。第 11 行字符串长度是 16大于 15 了需要申请内存。第 12 行拷贝构造深拷贝长度大于 15需要申请内存。第 14 行赋值运算符长度大于 15需要申请内存。第 16 行新创建的 s6长度大于 15需要申请空间。代码第 17 行将 s4 赋值给 s6虽然 s4 的长度大于 15但是当前 s6 的 capacity() 是 20完全能够放得下 s4所以不需要再申请空间。4char数组#include stdlib.h #include stdio.h #include string.h #include iostream int main() { char a[] Hello; char b[] {H, e, l, l, o}; char *c Hello; int d 0; printf(sizeof(a) %d, sizeof(b) %d, sizeof(c) %d\n, sizeof(a), sizeof(b), sizeof(c)); std::cout a , b , c std::endl; printf(a: %s, b: %s, c: %s; a %p, b %p, c %p, d %p\n, a, b, c, a, b, c, d); return 0; }a和b都是char数组但是a和b所占用的内存空间是不一样的a最后有一个字符串结束符b没有。c是字符指针。a和b是数组可以修改c是字符指针指向只读内存不能修改。a、b、c都是保存大栈上并且对比3者的地址大小可以看大栈是向下生长的c指向只读数据区。打印b的时候因为b是字符串类型直到遇到字符串结束符才会结束所以会打印两个Hello把a指向的字符串也打印出来了。sizeof传入数组名的话返回的是数组的长度c就是一个指针大小与字长有关。

相关新闻

VHDX虚拟磁盘安装Windows系统:高效部署与灵活管理指南

VHDX虚拟磁盘安装Windows系统:高效部署与灵活管理指南

1. 为什么选择VHDX:一个被低估的系统部署方案如果你还在用U盘刻录ISO、或者用第三方工具给硬盘分区来安装Windows,那可能真的有点“过时”了。今天我想聊一个我用了好几年,并且觉得效率极高的方法:用VHDX虚拟磁盘文件来安装Window…

2026/11/1 5:18:42 阅读更多 →
发版前 2 小时,Cursor 分级路由把账单炸了 3 倍——我的 4 层降级军规

发版前 2 小时,Cursor 分级路由把账单炸了 3 倍——我的 4 层降级军规

发版前 2 小时,Cursor 分级路由把账单炸了 3 倍--我的 4 层降级军规 深入探讨大模型路由策略:从血泪教训到最佳实践 为什么用大炮打蚊子:成本失控的深层分析 三周前我们接入了 Cursor 的智能路由功能,本意是构建一个经济高效的模型调用体系。最初的设想很美好:通过简单的条件…

2026/10/24 4:15:08 阅读更多 →
Cascade 强推 pre-commit 门禁后,Agent 竟跳过测试提交了代码——我的 3 层校验军规

Cascade 强推 pre-commit 门禁后,Agent 竟跳过测试提交了代码——我的 3 层校验军规

Cascade 强推 pre-commit 门禁后,Agent 竟跳过测试提交了代码--我的 3 层校验军规 AI智能体提交防护体系:从Cascade策略失效到三层防护架构 自以为坚固的门禁为何失守? 最初选择Cascade声明式策略引擎时,团队对其防护能力充满信心。这套系统理论上能够在git hook阶段就封杀所…

2026/10/22 10:59:38 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/1 0:24:43 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/1 10:36:53 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/1 10:36:51 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/1 1:06:58 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/1 10:35:11 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/1 9:35:41 阅读更多 →

日新闻

周新闻

月新闻