转载自 https://blog.csdn.net/weixin_43787492/article/details/113573559
1. 什么是字符串
以NULL字节结尾的0个或多个字符组成的序列。(C没有字符串类型)
字符串是一种特殊的字符数组,‘\0’ 为字符串结束标志。
字符串一旦被创建就存在于常量池中。
2. 如何创建字符串
1) 利用 字符指针 创建字符串
对字符串指针操作时会影响到常量池中的字符串。
char *name = "happy";
这并不是用指针定义字符串,而是把指针name指向字符串"happy"的首地址
char *ddd = "12345";
printf("ddd[0]=%c\n",ddd[0]); // 1
printf("ddd=%s\n",ddd); //12345
2) 利用 字符数组 创建字符串
以字符数组形式创建的字符串,实际上是从字符串常量池中复制了一个副本,
所以修改字符数组的内容时,只是修改的自己的副本,并不会影响到常量池中的字符串。
char name[] = "happy";
char array[5] = {'1','2','3','4','5'};
printf("%s\n",array); //输出12345烫烫烫
printf("array[0]=%c\n",array[0]);//1
这里输出字符串会乱码,因为字符串是以’\0’ 作为结尾标志的,编译器直到找到\0才会停止。
字符数组不会要求它的最后一个字符为\0,甚至可以不包含\0,
所以上面定义的字符数组合法,但如果定义的是字符串则必须要以\0作为结尾的标志。
因此有两种修改方法
char array2[6] = {'1','2','3','4','5'};
char array2[6] = {'1','2','3','4','5','\0'};
3) 利用 字符指针 和 字符数组 创建字符串的异同
const char *a = "123456";
char a[] = "123456";
3).1 同
从 代码实现上来看,功能是一样的,都是初始化一个字符串。
a都代表数组中首元素的地址
3).2 异
从计算机系统中的段式内存存储方式来看,两种初始化字符串的方式是有区别的:
对于: const char *a = "123456";
a是指向其字符串常量的地址的,但是字符串常量的地址通常存放在代码段(.text)区域,
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,不能对其数据进行修改。
因此我们需要在其数据类型名 char* 前加上 const进行修饰,也就是一个常量指针,确保使a指向的字符串内容不可以被修改。
对于:char a[]="123456";
a是一个初始化的变量。
如果是局部变量,则指向栈上的内存区域。
如果是 static 或全局变量则指向进程的 数据段(.data)内存区域。data 段权限是可读、可写;也就是可以修改其值。