[c++] 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 是常量字符串,这两个指针指向的地址也是相同的。

从 s1,s2 的地址和 s3,s4 的地址对比可以看出,s3 和 s4 的地址相距比较近,和 s1、s2 的地址相距比较远。s1、s2 和 s3、s4 保存的段都不一样,前者保存在只读数据段,后者保存在栈,所以地址差距才会大。 

2 std::string 是深度拷贝

如下图所示, 有 3 个字符串,s1、s2 和 s3。

s2 是基于 s1 通过拷贝构造而来,将 s2[1] 赋值为 'a',然后打印 s1 和 s2,s1 仍为 "hello",s2 为 "hallo",说明 s1 和 s2 相互不影响,是深拷贝。

s3 被 s1 赋值,将 s3[1] 赋值为 'm',然后打印  s1 和 s3,s1 仍为 "hello",s3 为 "hmllo",s1 和 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,所以不需要再申请空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/493474.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录7-9 P75 Saw spin sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill_Controller.cs using System.Collections; using System.Col…

QT信号槽实现分析

1.宏定义 qt中引入了MOC来反射&#xff0c;编译阶段变成 MOC–>预处理–>编译–>汇编–>链接 1-1、Q_OBJECT 这个宏定义了一系列代码&#xff0c;包括元对象和处理的函数 #define Q_OBJECT \public: \QT_WARNING_PUSH \Q_OBJECT_NO_OVERRIDE_WARNING \static c…

设计模式(二)单例模式的七种写法

相关文章设计模式系列 面试的时候&#xff0c;问到许多年轻的Android开发他所会的设计模式是什么&#xff0c;基本上都会提到单例模式&#xff0c;但是对单例模式也是一知半解&#xff0c;在Android开发中我们经常会运用单例模式&#xff0c;所以我们还是要更了解单例模式才对…

汇编语言与接口技术实践——秒表

1. 设计要求 基于 51 开发板,利用键盘作为按键输入,将数码管作为显示输出,实现电子秒表。 功能要求: (1)计时精度达到百分之一秒; (2)能按键记录下5次时间并通过按键回看 (3)设置时间,实现倒计时,时间到,数码管闪烁 10 次,并激发蜂鸣器,可通过按键解除。 2. 设计思…

音视频技术-电脑连接调音台时交流声的产生与消除

当电脑&#xff08;笔记本/台式机&#xff09;声卡通过音频线与调音台&#xff08;或扩音机&#xff09;连接时&#xff0c;能听到“交流声”。有时很轻微&#xff0c;有时很明显&#xff0c;甚至干扰正常的演讲或发言。 很多时候&#xff0c;我们在台上演讲时&#xff0c;都会…

模拟、排序(归并排序)算法

模拟、排序算法 一、模拟例题1、错误票据题目信息思路题解 2、回文日期题目信息思路方法一&#xff1a;暴力做法方法二&#xff1a;优化解法 题解方法一&#xff1a;暴力求解方法二&#xff1a;优化解法 二、排序例题1、归并排序题目信息思路题解 一、模拟 例题 1、错误票据 …

springboot222学生网上选课系统的设计与实现

学生网上选课系统的设计与实现 摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统学生选课信息管理难度大&…

MDC500-16-ASEMI工业电机专用MDC500-16

编辑&#xff1a;ll MDC500-16-ASEMI工业电机专用MDC500-16 型号&#xff1a;MDC500-16 品牌&#xff1a;ASEMI 正向电流&#xff08;Id&#xff09;&#xff1a;500A 反向耐压&#xff08;VRRM&#xff09;&#xff1a;1600V 正向浪涌电流&#xff1a;600A 正向电压&a…

MATLAB Function转C代码实战

文章目录 前言1. 准备工作2. 使用MATLAB Coder2.1 确定输入输出的类型2.2 MATLAB Coder过程 3. 代码调整和优化4. 编译和测试5. 性能分析和优化结语 前言 在科学与工程领域&#xff0c;MATLAB&#xff08;Matrix Laboratory&#xff09;是一种广泛使用的高级技术计算软件&…

【C之·预处理器】

系列文章目录 文章目录 前言一、预处理指令1. #line的用法1.1 概述 2. #error2.1 概述 二、示例1. #line2. #error 总结 前言 C 预处理器不是编译器的组成部分&#xff0c;但是它是编译过程中一个单独的步骤。简言之&#xff0c;C 预处理器只不过是一个文本替换工具而已&#x…

从0到1入门C++编程——08 函数模板和类模板

文章目录 函数模板1.函数模板基本语法2.函数模板使用的注意事项3.函数模板案例——数组排序4.普通函数和函数模板的区别5.普通函数和函数模板的调用规则6.模板的局限性 类模板1.类模板2.类模板和函数模板的区别3.类模板中成员函数创建时机4.类模板对象做函数参数5.类模板与继承…

飞机订票系统

飞机订票系统 获取源码——》公主号&#xff1a;计算机专业毕设大全