创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
c语言系列专栏: c语言之路重点知识整合
字符串 目录
- 一、字符、字符数组
- 1.字符
- 2.字符数组
- 二、字符串
- 三、字符串的存储原理
- 字符串常量在代码中代表所在常量区的首地址(地址常量)
一、字符、字符数组
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);
运行结果出现了乱码:
原因:
s1,s2字符数组在打印时,并不知道该打印到哪里结束,因此需要一个代表结束的字符——‘\0’
在字符数组的末尾添加结束语’\0’,再来输出就没有乱码:
如果将结束语提前,放在字符数组中间位置呢?
再打印输出到a(\141)就结束了,因为遇到了’\0’。
%s会一致打印每个字符,直到遇到’\0’为止。约定的特殊字符一一即字符串的结束标记’\0’
二、字符串
通过数组的方式定义字符串太过麻烦,我们可以直接用一个双引号代表字符串。
char str[50] = "TianXiCoding";printf("%s\n", str);
使用调试器查看str数组,str数组在字符串的后面自动补上了’\0’
同样在字符串中间添加’\0’就可以提前结束
三、字符串的存储原理
我们先定义一个字符串,并且使用指针指向它,再用调试器查看
char str1[] ="TianXi";char *p1 = "TianXi";char *p2="TianXi";
执行前:str1为7个字符的字符数组,p1,p2为还未指向任何的指针
通过上面的定义代码后,p1,p2被指向了同一个地址
尝试对指针进行修改时发生了错误:
原因就是TianXi字符串存放在常量区,"TianXi"字符串常量返回的就是他所在内存中的首地址。
当 char str1[] =“TianXi”;这条语句执行时,系统会在""常量区"寻找"TianXi"字符串常量,如果没有就创建一个。
由于str1为字符串数组,它会在栈区创建字符数组并把字符串常量的每个字符存入栈区的每个数组成员。
但是当执行 char *pl =“TianXi”:时,发现“常量区”有该字符串就把其首地址赋给p1,因此通过p1只能访问的第一个字符h, char *p2亦如此。所以p1和 p2指向同一个地址。
p1,p2在栈区指向常量区的字符串常量 首地址 不可改变
str1数组也在栈区 可以改变
修改str1数组,p1,p2没有发生变化:
同样 这条语句也不可执行:str1 = “how”;
数组名是个地址常量 不可被修改,数组知识点详见数组存储原理
字符串常量在代码中代表所在常量区的首地址(地址常量)
和数组一样,我们可以通过地址偏移读取字符串中的字符
数组和指针知识点:利用指针操作数组
#include <stdio.h>
int main()
{char str1[] ="TianXi";printf("%c\n", "TianXi"[3]); //地址[偏移] *(地址+偏移)printf("%s\n", "TianXi"+2);return 0;
}
大家的点赞、收藏、关注将是我更新的最大动力!欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!