尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

【C++字符串】char*、const char*、char[]和std::string

【C++字符串】char*、const char*、char[]和std::string
📅 发布时间:2026/7/23 20:12:21
专栏网址:https://blog.csdn.net/zhujushu/category_13112687.html

0.概述

在程序开发中,字符串操作是必不可少的功能之一。在众多编程语言中,C++对字符串有着底层、较良好的支持。

C++ 提供了以下两种字符串表示形式:

  • C语言风格 const char*、char[]、char* 等类型;
  • C++ std::string 类类型。

本文将介绍以上字符串类型使用的方式,并重点讲述std::string的功能。

1.const char*

const char* 是一个不可变的字符串常量类型,看以下代码:

const char* Str = "Hello World!";

里面 Str、"Hello World!" 都是const char*类型的,它可以是左值,也可以是右值。

注意区分const char* 和 char* const

char * const CConst; //指向字符的静态指针 const char * ConstC; //指向静态字符的指针

当const char*的值是一个右值时,C++编译器会在const char*的末尾添加'\0'。

2.char[]

char[]代表字符数组,可以对应一个字符串,如

char b[]="string2"; //b的长度是字符的数量+1 //因为gcc/g++编译器会在const char*的末尾添加'\0'

这里b是一个char数组(字符数组),每个元素对应一个字符,最后的元素为'\0'。

区别如下:

注意:char型数组的名字,也是该数组首元素的地址,是常量,不能改变。但char型数组的每个元素可以改变。

char b[]="Hello World!";//定义 printf("%s\n",b);//输出

结果:
Hello World!

3.char*

char* 是指向字符串的指针,与const char*不同的是,char*的值可以改变。

看以下代码:

char* Str = "Hello World!";//定义 Str="Hi!"; printf("%s\n",Str);

输出:

Hi!

里面 Str是char*类型的。

注意区分char[] 和 char* :

char * C = "Hello!"; C = "Hi!";//合法 C[0] = 'A';//非法访问只读内存非法 char CC[] = "Hello!"; CC = "Hi!";//报错,首元素地址无法改变 CC[0] = 'A';//合法

在ISO C++中,char* 被指明是危险的,它可能导致内存泄漏、溢出等风险,在开发中要慎用。

4.std::string

std::string是 C++ 标准库中提供的字符串类,用于处理动态大小的字符序列。它属于std命名空间,封装了字符串的存储和管理,提供了丰富的成员函数和操作符,简化了字符串操作。

头文件

使用std::string要引入<string.h>头文件,代码如下:

#include <string.h> //using namespace std; //使用引入的标准库的全部内容,使用时无需std::前缀,但容易造成重声明和污染 //using std::string; //同"using namespace std;",但只使用string类类型,推荐

基本用法

声明和初始化std::string可以通过多种方式完成:

std::string str1; // 默认初始化,空字符串 std::string str2("Hello"); // 从 C 风格字符串初始化 std::string str3(str2); // 从另一个 std::string 初始化 std::string str4(5, 'a'); // 重复字符初始化,结果为 "aaaaa"

常用成员函数

std::string提供了大量成员函数,以下是一些常用功能:

访问字符

char c = str2[0]; // 通过下标访问,不检查边界 char c2 = str2.at(1); // 通过 at() 访问,会检查边界

修改字符串

str1.append(" World"); // 追加字符串 str1.push_back('!'); // 追加单个字符 str1.insert(5, " C++"); // 在指定位置插入 str1.erase(5, 4); // 删除子串

容量操作

size_t len = str1.size(); // 获取字符串长度 bool empty = str1.empty(); // 判断是否为空 str1.resize(10); // 调整字符串大小

字符串操作

查找和替换

size_t pos = str1.find("World"); // 查找子串 if (pos != std::string::npos) { str1.replace(pos, 5, "Universe"); // 替换子串 }

子串提取

std::string sub = str1.substr(6, 5); // 提取从位置 6 开始的 5 个字符

输入输出

std::string可以与标准输入输出流配合使用:

std::string input; std::cin >> input; // 读取一个单词 std::getline(std::cin, input); // 读取一行 std::cout << input << std::endl; // 输出字符串

与 C 库函数互通

与 C 库函数交互时,由于使用的是const char* 或 char[],会造成类型不匹配。

std::string 提供了c_str()以获取const char*指针:

const char* cstr = str1.c_str();

性能与注意事项

  • std::string动态管理内存,自动处理存储空间的分配和释放。
  • 频繁的字符串拼接可能导致多次内存重新分配,影响性能。可以使用reserve()预分配空间优化。

现代 C++ 扩展

C++17 引入了std::string_view,提供对字符串的非拥有视图,适合只读场景,避免不必要的拷贝:

std::string_view view(str1.data(), 5); // 创建前 5 个字符的视图

5.总结

C++提供了多种字符串处理方式,包括C风格字符串(const char*、char[]、char*)和更现代的std::string类。

C风格字符串需要手动管理内存且易出错,而std::string通过自动内存管理简化了操作,并提供丰富的成员函数支持查找、替换、子串提取等常见需求。

std::string与标准输入输出流无缝集成,同时支持通过c_str()与C风格字符串交互。

C++17引入的std::string_view进一步优化了只读场景的性能。

开发中应优先使用std::string以提升安全性和可维护性,仅在必要场景下谨慎使用C风格字符串。


温馨提示:请留下点赞!

相关新闻

  • 深圳夏令营哪家师资强:军博营地专业深耕 - 18002239949
  • C语言-字符函数和字符串函数
  • TI微控制器RTI模块深度解析:从定时器原理到DMA触发与窗口看门狗实战

最新新闻

  • 基于C2000 CLA协处理器的三相异步电机无感FOC控制实战指南
  • 抖掌柜:抖音小店一件代发密文下单,规避隐私违规风险 - 电商分享
  • 百达翡丽香港2026年7月最新售后公告:门店地址、客服电话大汇总 - 百达翡丽服务中心
  • TI Jacinto平台实现YUV422输出的硬件旁路与TDM配置方案
  • 3个关键指标,帮你选出专业的种子包装袋厂家
  • 2026年法国名义雇主EOR服务排行:权威精选10大优质选项

日新闻

  • 亨得利盐城维修点在哪里?手表维修保养地址指南**公示(2026年7月最新) - 亨得利官方
  • 提升.NET API安全性:Boxed.AspNetCore.Swagger认证授权最佳实践
  • 帝舵佛山**网点地址更新:2026年7月售后热线电话与服务客户指南 - 帝舵中国官方服务中心

周新闻

  • SaaS软件行业GEO实践:AI搜索时代的品牌可见性与获客新路径
  • 什么是PCTFE?医药高端包装的“防潮王牌“材料
  • 【JVM调优实战】16-可视化利器-JConsole-VisualVM-JMC

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号