《C语言笔记:字符串和字符数组》
一,C语言使用指针来管理字符串
1,C语言本身是没有String类型的,C语言中的字符串类型是通过字符指针来间接实现的。
2,定义字符串的方法:char *p = "hello world";此时的p就叫做字符串,但是实际上p只是一个字符指针(本质上是一个指针,只是p指向了一个字符串的起始地址)。
3,C语言种字符串的本质:指针指向头,固定尾部的地址相连的一段连续的内存(类似于数组,字符串和字符数组很像)。
4,C语言中字符串有3个核心要点:第一,用一个指针指向字符串的头;第二,固定尾部(字符串总是以'\0'字符结尾);第三,组成字符串的各个字符彼此地址相连。
5,'\0'是一个ASCII字符,其实就是编码为0的那个字符(真正的0,和数字0是不同的,数字0的ASCII值是48)。要注意区分 '\0' 、0 、 '0'。(0等于'\0',‘0’等于48)。
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(void) 5 { 6 char a[10] = {0}; 7 8 printf(" a[4] = %c \n",a[4]); //显示为空什么都没有,也就是'\0'字符 9 printf(" a[4] = %d \n",a[4]); //显示0,字符'\0'的十进制数为0 10 11 a[4] = '0'; 12 printf(" a[4] = %c \n",a[4]); //显示0,显示的是字符0 13 printf(" a[4] = %d \n",a[4]); //显示48,字符0的十进制数为48 14 a[4] = 48; 15 printf(" a[4] = %c \n",a[4]); //显示0,显示的是字符0 16 printf(" a[4] = %d \n",a[4]); //显示48,字符0的十进制数为48 17 printf(" sizeof(a) = %d \n",sizeof(a)); //显示10,数组a所占的总空间 18 printf(" strlen(a) = %d \n",strlen(a)); //显示0,因为数组的第0个元素为字符'\0',以此便判定了字符串的结束 19 a[0] = 48; 20 printf(" strlen(a) = %d \n",strlen(a)); //显示1,因为数组的第1个元素为字符'\0',以此便判定了字符串的结束 21 a[1] = '0'; 22 printf(" strlen(a) = %d \n",strlen(a)); //显示2,因为数组的第2个元素为字符'\0',以此便判定了字符串的结束 23 }
二,字符串指针和字符串本身
1,指向字符串的指针和字符串本身是分开的两个东西。
2,比如说char *p = "linux",p本质上是一个字符指针,占四个字节(32位系统),“linux"分配在代码段占6个字节,实际上总共耗费了10个字节。
3,这10个字节中,4字节的指针p叫做字符串指针,5个字节用来存放linux,这5个字符的内存才是真正的字符串,最后1个字节用来存放'\0'的内存就是字符串的结束标志。
三,存储多个字符的两种方式:字符串和字符数组
1,字符数组char a[] = "linux";来说,定义了一个数组a,数组a占6个字节,右值”linux"本身只存在于编译器中,编译器将用它来初始化数组a后丢弃掉,内存中是没有“linux"这个字符串的,这句相当于 char a[] = {‘l','i','n','u','x','\0'};
2,字符串char *p = ”linux";定义了一个字符指针p,p占四个字节,分配在栈上,同时定义了一个字符串"linux",分配在代码区;然后把代码段的字符串的首地址赋值给p。
3,字符数组和字符串有本质的区别。字符数组本身是数组,数组自身自带内存空间,可以用来存放东西;而字符串本质上是一个指针,本身永远只占四个字节,而且这四个字节还不能用来保存有效数据,所以只能把有效数据存到别的地方去,然后把地址存在p中。
4,总的来说,就是字符数组自己存那些字符;字符串一定需要额外的内存来存那些字符,字符串本身只存真正那些字符所在的内存空间的首地址。
#include<stdio.h> #include<string.h> int main(void) { char a[] = "linux"; char *p = "linux"; printf(" a[2] = %c \n",a[2]); //显示n a[2] = 'w'; printf(" a[2] = %c \n",a[2]); //显示w 这个字符数组内存空间在栈区,内容可以修改 printf(" p[2] = %c \n",p[2]); //显示n //p[2] = 'w'; // 字符串实际的内存空间是在代码区,其内容不能被修改 //printf(" p[2] = %c ",p[2]); }
四,sizeof关键字和strlen函数
1,sizeof是C语言的一个关键字,是一个运算符。用来返回一个类型或者变量所占的内存字节数。
2,strlen是一个C语言的库函数,这个库函数声明在string.h中,原型是:size_t strlen(const char *s);这个函数接受一个字符串的指针,然后返回这个字符串的长度(字节为单位)。返回的长度是不包含字符串结尾的'\0'的。
3,sizeof(数组名)得到的永远是这个数组整个的大小,和数组中有无初始化,初始化多少是没有关系的;strlen是计算字符串长度的,只能传递合法的字符串进去才有意义。