C++中的字符( char )、字符数组( char[] )、字符串( std::string )

news/2025/1/6 11:53:36/文章来源:https://www.cnblogs.com/zeoHere/p/18651403

字符(char)

定义:char 是 C++ 中的基本数据类型,用于表示单个字符。char在内存中通常占用一个字节(8 位)。

在 ASCII 编码系统中,每个字符都对应一个唯一的整数值,char 类型可以存储这些值来表示相应的字符。

 char ch = 'A'; // 存储字符'A'

与其他类型的联系:

字符本质上是一个小整数类型,它可以与整数进行隐式转换。例如,可以将一个字符赋值给一个整数变量,此时存储的是该字符对应的 ASCII 码值。

int num = ch; // num 将得到 'A' 的ASCII码值 65

使用注意事项:

要注意字符的范围,有符号 char 通常范围是 - 128 到 127,无符号 char 范围是 0 到 255。

在进行字符运算时,要确保结果在这个范围内,否则可能导致未定义行为。

同时,在使用字符常量时,要用单引号括起来,如 'a',而不是双引号,双引号用于表示字符串。

字符数组(char[])

定义:字符数组是由字符类型元素组成的数组,用于存储多个字符。

char[]可以用来表示字符串,当作为字符串使用时,需要以空字符 '\0' 作为结束标志。例如:

char arr1[6] = {'h', 'e', 'l', 'l', 'o', '\0'};// 需要手动添加终止符'\0'
// 或者
char arr2[] = "hello"; // 编译器会自动添加 '\0'

与字符串的联系:

C 风格字符串本质上就是以 '\0' 结尾的字符数组。

许多 C 风格字符串处理函数(如 strcpy、strlen 等)都是基于这种以 '\0' 结尾的字符数组设计的。

使用注意事项:

要注意为字符数组分配足够的空间,包括存储字符串内容和结束符 '\0' 的空间。

在使用 C 风格字符串处理函数时,确保传递的字符数组是以 '\0' 结尾的,否则可能导致缓冲区溢出或未定义行为。

另外,字符数组(char[])在作为函数参数传递时,会退化为指针,函数内部无法直接获取数组的大小,需要额外传递大小信息。
void processCharArray(char arr[], size_t size) {for (size_t i = 0; i < size; ++i) {// 处理数组元素}
}

返回值

不建议返回局部字符数组,因为函数结束时局部数组的内存会被释放,导致返回的指针指向无效内存。

可以返回静态数组,但要注意多线程环境下可能出现的数据竞争问题。

更好的做法是使用动态分配内存并返回指针,调用者负责释放内存,例如:

char* createCharArray(size_t size) {char* arr = new char[size];// 初始化数组return arr;
}// 调用者使用完后需要释放内存
char* result = createCharArray(10);
delete[] result;

字符串(std::string)

定义:std::string 是 C++ 标准库提供的一个类,用于方便地处理字符串。

std::string封装了字符数组,并提供了一系列成员函数来进行字符串的操作,如拼接、查找、替换等。例如:
#include
std::string str = "world";

与字符数组的联系:

std::string 内部使用字符数组来存储字符串内容,但它自动管理内存,避免了手动内存管理的麻烦,如动态分配和释放内存。

std::string 可以通过 c_str() 成员函数转换为 C 风格的以 '\0' 结尾的字符数组。

使用注意事项:

虽然 std::string 方便易用,但在性能敏感的场景下,频繁的字符串操作(如拼接)可能会导致较多的内存分配和拷贝,影响性能。

可以使用 reserve 方法预先分配足够的空间来减少重新分配内存的次数。

另外,在与 C 风格字符串函数交互时,需要使用 c_str() 方法进行转换。

同时,std::string 对象在传递和返回时,现代编译器通常会进行返回值优化(RVO)和移动语义优化,以减少不必要的拷贝。

参数是字符串(std::string):

传递方式:可以通过值传递、引用传递(const std::string& 或 std::string&)。

值传递会进行字符串的拷贝,可能会有性能开销,特别是对于长字符串;使用 const std::string& 可以避免不必要的拷贝,适用于函数只读取字符串内容的情况;如果函数需要修改字符串,使用 std::string&。

兼容性:如果函数需要与 C 风格字符串函数交互,可能需要将 std::string 转换为 C 风格字符串(使用 c_str() 方法)。例如:

void processCString(const char* str) {// 使用C风格字符串处理函数
}
void processString(const std::string& s) {processCString(s.c_str());
}

返回值是字符串(std::string):

性能优化:现代 C++ 编译器通常会对 std::string 的返回值进行优化(如返回值优化,RVO),减少不必要的拷贝。但在复杂情况下,仍然需要注意性能问题。

如果返回的 std::string 是通过拼接等操作生成的,尽量使用 std::string 的移动语义(std::move)来避免不必要的拷贝。

内存管理:std::string 对象会自动管理其内部的内存,返回的 std::string 对象在调用者处可以正常使用,无需手动释放内存。

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

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

相关文章

P11503 [NordicOI 2018] Nordic Camping

P11503 [NordicOI 2018] Nordic Camping 花了我挺长时间。 帐篷都是正方形的,可以枚举左上角,二分正方形边长,二维前缀和判断是否合法。这部分复杂度为 \(O(n^2\log n)\)。处理出来后,问题似乎就变成了矩形取最大值,单点查询。直接做是 \(\log^2\) 的,65 pts。具体就是,…

OpenXR间接链接、API层总体排序、加载器设计

OpenXR间接链接 通过加载器间接链接,应用程序动态生成OpenXR命令调度表。如果找不到加载器,或者只有比应用程序更旧的API,则此方法允许应用程序正常失败。为此,应用程序在加载器库上,使用特定平台的动态符号,查找(如dlsym())xrGetInstanceProcAddr命令的地址。一旦发…

OpenXR™加载器-设计、操作、调用链

OpenXR™加载器-设计和操作 1.2.1概述 OpenXR是一个分层体系结构,由以下元素组成: 1)OpenXR应用程序 2)OpenXR加载程序 3)OpenXR API层 4)OpenXR运行时间 一般概念适用于Windows和Linux的系统的加载程序。 首先,让把OpenXR环境看作一个整体。OpenXR应用程序位于执行链的…

经典专著《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》4本书推荐

4本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》、《TVM编译器原理与实践》、《LLVM编译器原理与实践》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该…

使用format_obproxy_digest_log工具分析obproxy网络层耗时SQL

之前写过一个博客,介绍 ob_tools包 来实施抓取 observer 层的 gv$ob_sql_audit 的SQL,还提供一些分析SQL来通过不同维度分析缓慢的业务SQL语句,免得和应用扯皮说数据库执行SQL慢。 但是分析出服务端业务SQL语句执行时间还不够,应用也有可能会和你扯皮说obproxy转发慢,也不…

win 安装Android子系统WSA

win 安装Android子系统WSA 仅适用于Windows10和11。 在WSA中,对于要运行的应用不能保证较好的Android兼容性。 1.启用虚拟机平台功能 启用虚拟机平台: PS C:\Users\xxx> dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart然后重启计…

Windows环境配置Nginx服务实现负载均衡

系统环境:win10 测试服务:.net6.0+webapi 一、本地创建一个webapi项目二、新建一个api控制器,里面编写一个测试方法三、我直接把这一个项目复制了3份,然后修改控制器方法中的返回值分别为value01,value02,value03四、分别启动三个程序,并且配置不同的端口号Postman/Apif…

二维数组的使用

1.二位数组的理解 Java 语言里提供了支持多维数组的语法 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel中的表格一样。 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层…

https申请+部署

1.申请参考:https://developer.aliyun.com/article/1635083 自动就行。 2.成功后会下载到两个文件。一个.poe 一个.key 部署 1.在/etc/nginx/conf.d里面新建一个文件夹cert,然后把这两个文件放进去。2.返回到nginx.conf里面配置, 这是原来的 server{listen 80;serve…

使用 SK Plugin 给 LLM 添加能力

前几篇我们介绍了如何使用 SK + ollama 跟 LLM 进行基本的对话。如果只是对话的话其实不用什么 SK 也是可以的。今天让我们给 LLM 整点活,让它真的给我们干点啥。 What is Plugin?Plugins are a key component of Semantic Kernel. If you have already used plugins from Ch…