C语言字符串漫谈
在C语言中写字符串,我们一般这样定义变量
const char* str = "hello";
乍看这样的赋值方式有点费解,前面是一个char*指针,str指向一个char字符的指针,而后面是一个字符串,怎么都感觉类型不一致。
其实C语言应该说没有单纯的所谓字符串类型,所谓的字符串,只不过是一个个char类型字符成的数组,数组的最后一个元素是'\0'
在VS上打印输出看看
显示字符串"hello" 确实是const char[6] 类型,即字符数组类型,这边的字符数组的长度是6,而“hello”字符串是5个字符,实际存数组里面的最后一个元素是字符'\0'。
通过类型 const char[6] ,我们看到该字符数组中的每一个char类型元素都是const,表示常量,不可修改的。所以“hello”是一个不可修改字符的字符数组, 我们一般称这种加了双引号的字符字面量 为字符串。
当我们在代码中 写上一个字符串 "hello" 相当于在全局做了这样的定义 const char str[6]={'h','e','l','l','o','\0'} 。直接写“hello”相当于写字符数组的一个语法糖而已,如果你不嫌弃麻烦,完全可以用
const char str[6]={'h','e','l','l','o','\0'} 这种方式,代替"hello"。
看下GCC下的汇编代码
不管是字符串字面量"hello"还是通过字符数组strArr的方式定义,在汇编代码中都对应了一个标签,显示hello
则两则一模一样,没任何区别
对于strPtr和strPtr2的赋值,都是获取指向第一个字符'h' 的指针。
为什么会是第一个字符元素的指针呢?
因为当字符数组作为表达式时,常常退化为首元素的指针, 类型为const char*, 所以我们申明的strPtr和strPtr2变量,都是const char*类型。
所以其实字符串一点也不神秘 就是一个字符数组,每一个字符都是const ,导致不可修改。
我也可以定义int类型的不可修改数组,称之为int整型串。
const int intArr[3] = { 1,2,3 };
int main() {
const int* intPtr = intArr;
return 0;
}
跟我们之前定义的字符数组使用方式一样。
当你知道了字符串其实就相当于字符数组的时候,那么所有对字符串的操作,其实就是对数组和指针的操作。
上面的intArr数组,会被加载到一个只读内存中,我们尝试通过任何方法去修改该区域,运行时会报没有权限修改的异常
而字符串不可修改的原因也是如此。