(4)C中初始化字符串的几种方式和比较

一. 字符串的定义方式

C语言中的字符串是被当作字符数组来处理的,也就是说字符串是一种特殊的字符数组。字符串中的字符是逐个存放到字符数组中的。C语言中规定了‘\0’为字符串结束标志,设某字符数组中存在若干个有效字符,第n个字符为’\0’,那么前n-1个字符就组成了一个字符串,到‘\0’时字符串结束。

1. 利用字符指针创建字符串

(1.1)利用字符指针创建字符串,只能用字符串常量的方式进行初始化

const char *d = “123456”;
printf(“d[0]:%c\n”, d[0]); // 输出:1
printf(“d:%s\n”, d); // 输出:123456


2. 利用字符数组创建字符串

(2.1)情况1:定义了字符数组的长度

char arr[5] = { ‘1’,‘2’,‘3’,‘4’,‘5’ };
printf(“%s”, arr); //: 输出12345烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫
printf(“arr[0]:%c\n”, arr[0]);//输出:1 输出字符正常

注意:
(1)这里输出字符串会乱码,因为字符串以\0作为结尾标志的,编译器直到找到\0才会停止。
(2)字符数组不会要求他的最后一个字符为\0,甚至可以不包含\0,所以上面定义的字符数组合法,如果定义的是字符串则必须要以\0作为结尾的标值。

因此有两种方式可以修改上面的语句:

第一种:
char arr2[6] = { ‘1’,‘2’,‘3’,‘4’,‘5’ };
第二种:
char arr2[6] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};
printf(“arr2:%s\n”, arr2);//输出123456

注意:
(1)上面两种修改方式等价。
(2)如果字符数组的长度大于我们设定的元素个数,其余的空元素会自动转化为\0。

(2.2)情况2:省略了定义数组长度

char arr3[] = { ‘1’,‘2’,‘3’,‘4’,‘5’ };// 输出12345烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫…

注意:
(1)数组长度会自动定为5,因此输出乱码原因同情况1一样
(2)\0会占一个字节空间,但不会输出,因此想要上式输出字符串,必须加\0字符结尾
因此可以修改为:

char arr3[] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’};// 输出12345


3. 利用字符串常量来初始化字符数组

char arr4[] = { “123456” };
char arr4[] = “123456”;
printf(“arr4[]:%s\n”, arr4);// 输出123456

注意:
(1)上面两式等价
(2)以“”这种字符串常量的方式进行存储时,系统会自动在最后一个字符的后面加上一个’\0’,作为字符串结束标志。
(3)char a[] = “123456” 和 char a[] = { ‘1’,‘2’,‘3’,‘4’,‘5’,‘\0’}是等价的。与 char a[] = { ‘1’,‘2’,‘3’,‘4’,‘5’}不是等价的




二. 字符指针创建字符串和字符数组创建字符串的区别

const char *a = "123456";
char a[] = "123456";

区别:

这两行代码从实现上来看,它两的实现功能是一样的,都是初始化一个字符串。


两者都可以通过 a a a访问数组元素,且 a a a都代表数组中首元素的地址,都可以通过下标查找/输出某字符。
如下所示:

	const char *d = "123456";
	printf("%d\n", (int*)d);     地址输出:709729692
	printf("%d\n", (int*)&d[0]); 地址输出:709729692
	printf("%d\n", (int*)&d[1]); 地址输出:709729693
	printf("%c\n",  d[0]);       输出:1
	printf("%c\n", *d);          输出:1

	char a[] = "123456";
	printf("%d\n", (int*)a);     地址输出:1320154980
	printf("%d\n", (int*)&a[0]); 地址输出:1320154980
	printf("%d\n", (int*)&a[1]); 地址输出:1320154981
	printf("%c\n", a[0]);        输出:1
	printf("%c\n", *a);			 输出:1

计算机系统中的段式内存存储方式来看,两种初始化字符串的方式是有区别的:
对于: c o n s t const const c h a r ∗ a = " 123456 " char *a = "123456" chara="123456";
a a a是指向其字符串常量的地址的,但是字符串常量的地址通常存放在代码段(.text)区域,这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,不能对其数据进行修改。因此我们需要在其数据类型名 c h a r ∗ char* char前加上 c o n s t const const进行修饰,也就是一个常量指针,确保使a指向的字符串内容不可以被修改。
如下:

const char *a = "123456";
a[1] = '6';//报错输出:表达式必须是可修改的左值

对于: c h a r char char a [ ] = " 123456 " a[] = "123456" a[]="123456";
a a a是一个初始化的变量。如果是局部变量,则指向栈上的内存区域。如果是 static 或全局变量则指向进程的 数据段(.data)内存区域。data 段权限是可读、可写;也就是可以修改其值。
如下

char a[] = "123456";
a[1] = '6';
printf("%s",a);//正常输出:163456

补充

利用字符串常量的初始化方式去定义字符数组,即 c h a r char char a [ ] = " 123456 " a[ ] = "123456" a[]="123456";
对字符数组的操作和普通数组的操作是一样的,比如上式种的 a a a 也是数组名,既是字符数组的地址,也是字符数组种首元素的地址,因此可以进行下列操作:

	char a[] = "123456";
	*a = '6';
	printf("%s", a);//输出623456

  • 13
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徽州SLAM李

如果觉得不错,打赏一下哦,嘻

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值