const char*
const char* 用来定义字符串常量。
char[ ]
char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如:
char arr[] = {'h', 'a', 'l', 'l', 'o', '\0'};
char c = arr[0]; // 访问数组的第一个元素‘h’
char*
char* 用来定义一个字符串,它指向字符数组的指针,指针的值是第一个字符的地址,字符串中的每个字符都是用连续的内存单元存储的。此时应该加上长度限制,如 char* str = new char[80];
。
char *str = “hallo”;
这里的str是一个指向字符数组的指针,指向以字符‘h’开始的内存单元,后面依次存放了其他字符,最后以‘\0’结尾。在使用指针指向的字符串时,我们通常使用指针访问字符串的每个字符,如:
char *str = "hallo";
char c = str[0]; // 访问字符串的第一个字符‘h’
char[]和char*的区别
1. 类型不同
char*是指针类型,用于表示一个指向字符数组开头的指针,而char[]是字符数组类型,用于表示一个字符数组。
2. 指向的内容能否修改
char* 声明的字符串常量在内存中是以只读的方式存储的,不能被修改;而char[]声明的字符数组可以修改。
3. 是否支持指针运算
char*可以进行指针运算,如++、–、+ 和 - 等操作;而char[]不支持这些操作。如:
char *str = “hallo”;
char c = *(str + 1); // 通过指针运算访问字符串的第二个字符
str + 1 表示指向字符串中的第二个字符,然后使用 * 运算符来访问该字符的值。
4. 是否支持动态分配内存
char*可以进行动态分配内存,如使用 malloc()分配内存空间;而char[]声明的字符数组大小在编译时就已经确定,无法动态改变其大小。
5. 是否可以修改指向性
在函数参数中,char*表示一个指向字符数组的指针,可以被修改;而char[]表示一个字符数组,不能被修改,即char[]实际上是一个指向字符数组的指针,但它是一个常量指针,所以不能够被修改。
char* 类型的变量可以被修改,它指向的字符数据可以被修改;而char[]类型的变量则是一个常量指针,不能被修改。如:
// 合法代码
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:
字符串、数组和指针有太多的地方需要探索,在以后刷题的过程中中,多多练习,慢慢的提高!
真的感觉很绕,即使我在整理的时候也要不断的停下来再思考。