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数组,会被加载到一个只读内存中,我们尝试通过任何方法去修改该区域,运行时会报没有权限修改的异常

而字符串不可修改的原因也是如此。

char charArr[6] = "hello";
这种方式,相当于把"hello"字符数组中的每一个元素,赋值给charArr中的元素,进行初始化
初始化以后,charArr跟后面的字符串“hello” 没有任何关系,只不过值一样
因为charArr没有用const修饰符,所以字符数组是可以修改的。
 

 

posted @ 2022-11-18 19:48  自由小菜园  阅读(106)  评论(0编辑  收藏  举报