C++ - char*、const char*、char[]、string

const char*

const char* 用来定义字符串常量。

char[ ]

char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如:

cpp 复制代码
char arr[] = {'h', 'a', 'l', 'l', 'o', '\0'};
char c = arr[0];	// 访问数组的第一个元素'h'

char*

char* 用来定义一个字符串,它指向字符数组的指针,指针的值是第一个字符的地址,字符串中的每个字符都是用连续的内存单元存储的。此时应该加上长度限制,如 char* str = new char[80];

cpp 复制代码
char *str = "hallo";

这里的str是一个指向字符数组的指针,指向以字符'h'开始的内存单元,后面依次存放了其他字符,最后以'\0'结尾。在使用指针指向的字符串时,我们通常使用指针访问字符串的每个字符,如:

cpp 复制代码
char *str = "hallo";
char c = str[0];	// 访问字符串的第一个字符'h'

char[]和char*的区别

1. 类型不同

char*是指针类型,用于表示一个指向字符数组开头的指针,而char[]是字符数组类型,用于表示一个字符数组。

2. 指向的内容能否修改

char* 声明的字符串常量在内存中是以只读的方式存储的,不能被修改;而char[]声明的字符数组可以修改。

3. 是否支持指针运算

char*可以进行指针运算,如++、--、+ 和 - 等操作;而char[]不支持这些操作。如:

cpp 复制代码
char *str = "hallo";
char c = *(str + 1);	// 通过指针运算访问字符串的第二个字符

str + 1 表示指向字符串中的第二个字符,然后使用 * 运算符来访问该字符的值。

4. 是否支持动态分配内存

char*可以进行动态分配内存,如使用 malloc()分配内存空间;而char[]声明的字符数组大小在编译时就已经确定,无法动态改变其大小。

5. 是否可以修改指向性

在函数参数中,char*表示一个指向字符数组的指针,可以被修改;而char[]表示一个字符数组,不能被修改,即char[]实际上是一个指向字符数组的指针,但它是一个常量指针,所以不能够被修改。

char* 类型的变量可以被修改,它指向的字符数据可以被修改;而char[]类型的变量则是一个常量指针,不能被修改。如:

cpp 复制代码
// 合法代码
char str1[] = "hallo";
char *str2 = "China";

str2 = str1;	// 可以修改指针指向的位置
str2[0] = 'a';	// 可以修改指针指向的位置上的字符数据

// 不合法代码
char str3[] = "hallo";
char str4[] = "China";
 
str4 = str3; // 不可以修改数组指针的指向
str4[0] = 'a'; // 可以修改数组指针指向的位置上的字符数据

char**

它定义了指向char*的指针,是二级指针,因为右边是数组,而数组的元素为char型指针,即为指向指针的指针,因此叫2级指针。

char** ppstr = new char*[80];。char** ppstr 代表指向内存首地址,也就是一个char指针的指针对ppstr可以用下标方式代表数组第几个元素,也就是第几个char指针的意思。

char*[80],因为[ ]的优先级高,所以它表示是一个数组,数组的元素为指针。

new char*[80],表示开辟了一块内存,存放80个char指针的内存空间,大小为sizeof(char) * 80 = 320个字节。

string

string是std::basic_string模板类的实例化,是一个类。string str = "abc"; 其实是const char*转class, string重载了"=",把"abc"封装成std::string。

string、char*、char[ ]和const char*相互转换

Ps:

字符串、数组和指针有太多的地方需要探索,在以后刷题的过程中中,多多练习,慢慢的提高!

真的感觉很绕,即使我在整理的时候也要不断的停下来再思考。

相关推荐
优秀的颜39 分钟前
计算机基础知识(第五篇)
java·开发语言·分布式
CodeWithMe40 分钟前
【C/C++】std::vector成员函数清单
开发语言·c++
uyeonashi41 分钟前
【QT控件】输入类控件详解
开发语言·c++·qt
iCxhust2 小时前
Prj10--8088单板机C语言8259测试(1)
c语言·开发语言
крон5 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan5 小时前
c++ 单例模式
开发语言·c++·单例模式
老胖闲聊6 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1186 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
曹勖之6 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?7 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏