1.基本概念
C语言没有独立的字符串类型,字符串被当作字符数组处理。但在处理字符串时,在字符串最后一个字符后边会自动添加一个全是二进制 0 的字节,写作 "\0" 字符,表示字符串结束。所有字符串的最后一个字符,都是 "\0" 。这样不需知道字符串的长度,就可以读取内存里面的字符串,一旦读到字符 "\0" 则字符串结束。也由此,声明的字符串长度与实际能存放的字符串长度差一个,即 "\0" 。
正因为字符串是字符数组,所以有关数组的操作对于字符串同样适用。
字符串数组赋初值可以写成大括号内单引号引着的一个个字符。这样写是太麻烦,实际中的字符串赋初值是用一对双引号把连续字符引起来;它与字符数组等价,但形式简单。例如:
char myStr[] = "Hello World!"; //强调:这种写法只能是在字符数组声明时赋初值
上面声明的字符串,名:myStr 长度:13(包含空格、结尾"\0")。这个 "\0" 一定要牢记,比如:char a='1'; 与char a[] = "1"; 这两者一个是双引号一个是单引号,区别就在 "\0"上,"1"不但有1还有 "\0",而'1'只有1。
如果字符串中,本身就包含双引号怎么办呢?给双引号前边加上一个反斜杠(称为转义符)即\",就把双引号加到字符串中了。
上面的举例如写成:myStr[]="Hello ""World";(即连续的几对双引号都赋给一个字符串)也是符合语法的,不会报错。
在printf函数中输出字符串:常量直接输出,变量用%s占位符输出。
2.字符串变量的声明
字符串变量可以按字符数组形式声明,也可以用指向字符数组的指针形式进行声明。
char myStr[1024] = "C语言从头学"; //声明长度1024字节实际使用不了会初始化成 "\0"
//如果不写具体长度只写空的[ ],计算机会自己计算所需要的长度
char* myStr = "C语言从头学";
上面的声明形式上差不多,但还是有差异,表现在:
a.字符数组声明的字符串变量可以一个一个字符进行修改,但不能重新赋值;
char a[]="1134"; a[0]='0'; a[1]='2'; //合乎语法
但如果:a[]="4311"; //会报错
b.指针方式声明的字符串变量可以重新赋值,但不能单个字符进行修改;
char* b="1111"; b="2222"; //合乎语法
但如果:b[0]='2'; //可能报错或出现错误运算结果
3.说明:单独字符能不能修改的原因:为什么字符串声明为指针时不能单独字符修改,声明为数组时就可以修改?原因是声明为指针时,字符串是一个保存在内存“栈区”的常量,“栈区”的值由系统管理,一般都不允许修改;声明为数组时,字符串的副本会被拷贝到内存“堆区”,“堆区”的值由用户管理,是可以修改的。整个字符串能不能修改原因:以指针形式声明的字符串变量,因为其是变量故可以指向其它的字符串;而字符数组变量虽称作变量但不能指向另一个字符串,因为字符数组的数组名总是指向初始化时的地址,不能修改。
C语言从头学30——字符串
2025/4/2 8:34:02
来源:https://blog.csdn.net/m0_72128260/article/details/140234616
浏览:
次
关键词:C语言从头学30——字符串
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 《警世贤文》摘抄:处人篇、受恩篇、宽人篇、听劝篇、劝善篇(多读书、多看报、少吃零食多睡觉)
- `git restore` 和 `git checkout` 用于丢弃工作区的改动, `git switch` 和 `git checkout` 用来切换分支
- Vmess协议是什么意思? VLESS与VMess有什么区别?
- Android显示系统(08)- OpenGL ES - 图片拉伸
- nccl 03 记 回顾:从下载,编译到调试 nccl-test
- 【CVE-2024-38077】核弹级Windows RCE漏洞如何自检并修复该漏洞(附批量漏洞检测工具及分析伪代码)
- windows11 ,ubuntu20.04双系统,ubuntu没有wifi的解决方式
- 【HW必备】用友NC-Cloud存在17处漏洞合集
- AD24设计步骤
- PyTorch 和 Python关系