C语言字符串

转载自 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 段权限是可读、可写;也就是可以修改其值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值