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:

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

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

相关推荐
Envyᥫᩣ几秒前
C#语言:从入门到精通
开发语言·c#
童先生22 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu23 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
凌云行者2 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl