【c语言】字符串的基本概念 | 字符串存储原理

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

c语言系列专栏: c语言之路重点知识整合


一、字符、字符数组

1.字符

字符char知识点:字符类型详解

每个我们看见的字符影像都有自己的影响编码,每个字符对应着各自的影响编码(ASCII码)

根据ASCII码,每个字符都有其各自的数字编码,通过使用数字编码即可打印出对应的字符影像

对于一个字符输出其%d格式为其数字编码,输出%c格式就是其字符影像

2.字符数组

定义一个字符数组:

	char s1[] = { 'T','i','a','n','X','i'};
	char s2[] = { 'T',105,'\141','\x6',01011000,'i','\n'};
	printf("%s\n", s1);		// %s 以字符串格式打印
	printf("%s\n", s2);

运行结果出现了乱码:

image-20230506084356443

原因:

s1,s2字符数组在打印时,并不知道该打印到哪里结束,因此需要一个代表结束的字符——’\0’

在字符数组的末尾添加结束语’\0’,再来输出就没有乱码:

image-20230506084849461

如果将结束语提前,放在字符数组中间位置呢?

image-20230506085028132

再打印输出到a(\141)就结束了,因为遇到了’\0’。

%s会一致打印每个字符,直到遇到’\0’为止。约定的特殊字符一一即字符串的结束标记’\0’

二、字符串

通过数组的方式定义字符串太过麻烦,我们可以直接用一个双引号代表字符串。

	char str[50] = "TianXiCoding";
	printf("%s\n", str);

image-20230506085527990

使用调试器查看str数组,str数组在字符串的后面自动补上了’\0’

image-20230506085655511

同样在字符串中间添加’\0’就可以提前结束

image-20230506085736680

三、字符串的存储原理

我们先定义一个字符串,并且使用指针指向它,再用调试器查看

	 char str1[] ="TianXi";
	 char *p1 = "TianXi";
	 char *p2="TianXi";

执行前:str1为7个字符的字符数组,p1,p2为还未指向任何的指针

image-20230506090018681

通过上面的定义代码后,p1,p2被指向了同一个地址

image-20230506090256086

尝试对指针进行修改时发生了错误:

image-20230506090438494

原因就是TianXi字符串存放在常量区,"TianXi"字符串常量返回的就是他所在内存中的首地址。

当 char str1[] =“TianXi”;这条语句执行时,系统会在""常量区"寻找"TianXi"字符串常量,如果没有就创建一个。

由于str1为字符串数组,它会在栈区创建字符数组并把字符串常量的每个字符存入栈区的每个数组成员。

但是当执行 char *p1 =“TianXi”:时,发现“常量区”有该字符串就把其首地址赋给p1,因此通过p1只能访问的第一个字符T, char *p2亦如此。所以p1和 p2指向同一个地址。

p1,p2在栈区指向常量区的字符串常量 首地址 不可改变

str1数组也在栈区 可以改变

修改str1数组,p1,p2没有发生变化:

image-20230506091109357

同样 这条语句也不可执行:str1 = “how”;

数组名是个地址常量 不可被修改,数组知识点详见数组存储原理

字符串常量在代码中代表所在常量区的首地址(地址常量)

和数组一样,我们可以通过地址偏移读取字符串中的字符

数组和指针知识点:利用指针操作数组

#include <stdio.h>
int main()
{
	 char str1[] ="TianXi";
	 printf("%c\n", "TianXi"[3]);	//地址[偏移]  *(地址+偏移)
	 printf("%s\n", "TianXi"+2);
	return 0;
}

image-20230506091643705

大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!

  • 12
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天喜Studio

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值