6.5 字符串与指针
之前我们说过关于字符的一些内容,字符的原理,归根到底就是将我们常用的一些字符根据编号整理成一张统一的表,每个字符对应着这个表里面的一个数值,这一过程就是字符的编码。
然而大多数时候我们根本就不会使用单个字符,比如计算机上面要输出一句句子“hello world”,这个句子里面就是由多个字符所组成的,分别是“h”,“e”,“l”,“l”,“o”,“(空格也是字符)”,“w”,“o”,“r”,“l”,“d”,这种有多个字符组成的句子,在c语言中被称为“字符串”。
了解完字符串是由多个字符组成的之后,想要存储字符串就变得非常容易了,我们只需要定义多个变量来存储这些字符就可以了,如要输出“hello”,我们只需要定义五个字符型变量来存储这些字符,然后就可以做一些处理。如,打印出“hello”,如图1所示。
图1 字符连接成字符串
这样就可以打印出一个“hello”的句子出来了,但是,这种分散式字符组成字符串的方式在做字符串处理的时候,非常吃力,最好的方式就是可以将这些字符存储到一个集群式的变量里面,我们c语言中集群式的存储类型只有数组一种类型,因此上面的程序中的五个变量可以改造成一个数组,这个数组定义好之后就可以用来存放这些字符了。改造完成的程序如图2所示。
图2 数组存放字符
上面的字符串中字符是被一个一个存入数组中的,这种方式显得有些繁琐,特别是操作字符串的时候,还需要使用for语句进行循环操作,这样在使用字符串的时候,操作的时候太过于麻烦。我们还可以再改造一下上面的程序。在c语言中,定义用双引号“”””包住的一句句字有一个特殊的称呼,它就叫字符串。同时在c语言中使用“printf”函数的时候,还有特殊适配符去适配这种数据类型。对图6-5-2中的程序改造如图3所示。
图3 字符串赋值给数组
上面的程序中,我仔细看可以发现,打印输出的结果有些不正常,就是在hello打印完成之后有多输出了一个“?”。这是程序的一个小bug,出现的原因是,当我们使用字符串去赋值给一个数组的时候,除了这个字符串正常的字符之外,在最后一个字符结束之后,字符串会额外增加一个’\0’字符,这个’\0’字符就是字符串结束的一个标志性字符,没有实际意义,而当我们给一个长度为5的数组中存入“hello”字符串时,实际上是会存入6个字符,而用printf函数的%s适配时,由于检测不到’\0’字符,所以函数不会停地打印字符,直到遇到‘\0’。修改的方式很简单,只需要将字符的长度增加一个即可,如图4所示。
图4 字符串赋值给数组,数组长度需
虽然程序中的问题解决了,但是这种方法是不是意味着每次给数组赋值字符串的时候,都需要去数这个字符串里面有多少个字符,然后加1,再去定义一个数组呢?显然不是,如果真要这样的话,那么c语言可能早就被淘汰了。其实在给一个数组初始化赋值一个字符串的时候,我们根本就不需要去显示地指出这个字符串的长度,如图5所示。
图5 字符串赋值给数组,数组长度需
说到这里,我们其实就可以明白,字符串的本质其实就是字符型数组,因此当我们使用指针操作的时候,也只需要像操作数组一样去操作字符串即可。基于上面的程序,我们可以定义一个字符型指针去指向一个字符串,这样,这个字符串指针具有这个数组的特性。如图6所示。
图6 指向字符串的指针
以上就是关于指向字符串指针的定义,指针在平时使用中有很多情况都是来处理一些字符串数据的,我们在后面的章节会继续讨论这个问题。
交流电机的工作原理 交流电机的优缺点
Z-Wave技术与其他无线通讯技术相比,有哪些无可匹敌的优势呢?
剖析华为和博世L4级代客泊车系统
SASO2870办理流程是怎样的?
基于LAMP-IDE精准基因快速检测技术
C语言中的字符串与指针
机械硬盘的下一目标阶段或将是2026年的50TB容量
电池技术何去何从 是否真的成为“搁浅资产”
CA-IS3740LW 四通道标准数字隔离器的介绍
数字化加持管理创新,博尔捷数字科技集团发布复合用工管理云平台
新西兰运营商Spark总经理强烈支持华为作为5G移动网络技术的供应商
这才是在VR世界中行走的正确姿势
物联网需要怎样的操作系统
美国安科收购石英MEMS惯性产品全球领先制造商SDI
iPhone13发布会前瞻汇总
供不应求的8英寸晶圆与逐年下滑的生产线
视觉传感器的分类
光纤收发器如何实现长距离组网,实现方法介绍
智慧消防领域怎样加快进程
机器人黄金时代到来 仓储机器人有“钱”图