c语言------字符串详解(非常详细)

什么半岛铁盒 2024-06-24 10:05:01 阅读 86

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

前言一、什么是字符串?二、在程序中定义字符串1、字符串常量(涉及一些复杂的知识)2.字符串数组和初始化3.数组和指针


前言

字符串是c语言中最有用、最重要的数据类型之一。我们在介绍字符串时 或多或少的会涉及指针,这是不可避免的。(实际上字符串的大多数操作都 是通过指针完成的)

一、什么是字符串?

字符串是一个多个字符的序列(包括:数字、字母、空格等)如:

“This is an array of atrings” 要注意:双引号不是字符串的一部分。双引号仅告诉编译器它括起来的是字符串。

二、在程序中定义字符串

在学习下面知识前我们要先知道,C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组都由连续存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个存储单元(一字节)存储一个字符。

1、字符串常量(涉及一些复杂的知识)

双引号括起来的内容称为字符串常量(C语言中不存在字符串变量)。

双引号中的字符和编译器自动加入末尾的**\0**字符,都作为字符串存储在内存中,下面是一些例子:

"Give me a thumbs up"//在定义字符串时编译器会自动在字符串最后加入'\0'字符在下面我们会详细讲解"Thank you for your support"//

在定义字符串时,字符串常量见没有间隔或用空白字符分割,C语言将会把它们看作串联起来的字符串常量。示例:

char ch1[30] = "Stick" "to it will ""be something";printf("ch1 = %s \n", ch1);//%s是打印字符串的格式符char ch2[30] = "Stick to it will be something";printf("ch2 = %s \n",ch2);

程序运行结果:

在这里插入图片描述

可以看到上述例子,在进行字符串打印操作时(printf(“ch2 = %s \n”,ch2);),实际参数位置只需要给出数组名,我们知道数组名代表数组首元素地址,也就是数组开始位置,那么下面代码也可以做到相同的效果:

printf("%s \n", "Stick to it will be something");

这是否说明双引号中的内容也是代表首元素的地址呢?下面我们测试一下,代码如下:

printf("%p %c\n", "Stick",*"Stick");

代码运行结果:

在这里插入图片描述

通过%p转换确实打印出了一个地址,我们通过对这个地址的解引用得到了这个字符串的首元素,证实了上面的猜想。

2.字符串数组和初始化

我们在定义字符串数组时,如果在程序运行前知道要存储内容,就可以开辟足够大的空间用来存储字符串,或是省略数组初始化声明中的大小(编译器会自动计算数组大小,并开辟出足够大的空间)。示例使用“Stick to it will be something”演示:

char ch[40] = "Stick to it will be something";char ch2[] = "Stick to it will be something";//如果创建一个稍后再填充的数组,必须在声明时指定大小

值得一提的是,在开辟空间大于字符串所需空间时,空间剩余部分会被初始化为‘\0’。示例:

char ch[5] = "six";//为方便展示,初始字符串较短

可以看到下方字符串数组内存存储情况,未使用部分全部使用‘\0’初始化

在这里插入图片描述

下面我们再来认识一种不常用的初始化方式,示例如下:

char ch[10] = { 'H','e','l','l','\0' };printf("%s ", ch);//注意这里如果没有空字符('\0')就不是一个字符串,而是一个字符数组//字符数组不可以用上述形式输出

我们在指定数组大小时,要确保数组可存储元素个数至少比字符串长度多1(再次强调编译器编译程序时会在字符串最后添加‘\0’,这也是字符串结束的标志)

3.数组和指针

在阅读这块时要注意,下面介绍的只是很浅显的知识,如果非要展开来讲,就会涉及到C语言后面的 知识(数据存储----程序的内存分配),对于刚接触的同学来说,可能会难以理解。

char ch[10] = "sihio";//数组形式char* c = "sihio";//指针形式//下面代码均以这里为例

数组形式:

在进行上述形式存储时,编译器会把数组名ch,当作数组首元素地址(&ch[0])的别名(就像我们给同学起外号一样),在这里我们要清楚,ch是地址常量(常量不可被修改),如果修改了ch也就意味着更改了数组存储的位置,也就是说我们在对数组进行操作时可以进行类似ch+n(n指所有小于数组范围的整数)的操作,但不允许进行类似这样的操作:++ch(大家应该知道自增运算符会改变作用对象大小)。

指针形式:

在程序运行时,它会为c指针变量开辟应该属于它的空间,并把字符串首字符的地址存储在这块空间中,这个指针变量的值是可以改变的,所以它可以使用自增运算的进行++c的操作。

这里就不演示了,大家可以自己试一下。

数组和指针的区别:

两者的主要区别是:数组名ch是常量,而指针c是变量(这关系到他们使用时的区别)。

关于字符串,还有很多知识我并没有在这里提到,C语言知识间的联系还是很强的,如果要面面俱 到,就会涉及到很多其他的知识,不利于理解。字符串在C语言中还是很重要的,下次我会给大家介绍 C语言专门为操作字符串而定义的函数。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。