文章目录
- 一、字符串
- 二、字符数组
- 三、字符串常量(字符指针)
- 易错点
- 总结
一、字符串
在C语言中,没有专门的字符串变量,没有string类型。
字符串定义有两种方法:一是利用字符数组,二是利用字符指针 。
字符串是指由一对双引号(“”)括起来的字符序列。例如char str[6] = “Hello”;
也可以不指定数组长度。例如char str[] = “Hello”;
字符串的结束标记为’\0’或’0’,因为’\0’的ASCII码值为’0’。
由" "包围的字符串会自动在末尾添加’\0’。例如,"abc123"从表面看起来只包含了 6 个字符,其实不然,C语言在最后隐式地添加一个’\0’,这个过程是在后台默默地进行的。
但逐个字符地给数组赋值并不会自动添加’\0’
二、字符数组
字符数组是存储连续字符的内存空间。
字符数组不一定能构成字符串
例:
char str[] = {‘a’,‘b’,‘c’}; 无法组成字符串
char str[] = {‘a’,‘b’,‘c’,‘\0’}; 可以组成字符串
char str[5] = {‘a’,‘b’,‘c’}; 可以组成字符串(因为给了5的容量,但元素只有3个,后面值为0,对应为’\0’)
char str[5] = “abc”;可以组成字符串
char str[] = “abc”;可以组成字符串
char str[] = {‘a’,‘b’,‘c’,‘\0’,‘c’}; 可以组成字符串(有’\0’就可以)
是%s 格式是用于输出字符串的,它需要从一个地址开始(str 数组名代表的是一个地址)连续输出每一个字符的影像,直到遇到一个结束标记才能停下来。这个结束标记就是 0 号的字符编码。通常这个 0 号字符编码我们用字符型的 8 进制常量的方式表示即’\0’。
也就是说:char str[] = {‘a’,‘b’,‘\0’,‘c’,‘\0’};则 str 数组所存储的字符串为 ab
定义字符数组是也可以对部分元素赋初值,此时,未被赋初值部分将被赋值为0,字符为空格。
字符数组只有在定义时才能将整个字符串一次性地赋值给它,一旦定义完了,就只能一个字符一个字符地赋值了。
//错误(因为str是数组名是一个地址,是一个指针常量,是不可以被修改的)
char str[7];
str = "abc123";
//正确
str[0] = 'a'; str[1] = 'b'; str[2] = 'c';
str[3] = '1'; str[4] = '2'; str[5] = '3';
三、字符串常量(字符指针)
类似于:char* p1 = “Hello”;
例
char str1[] = "Hello";
char* p1 = "Hello";
char* p2 = "Hello";
正常的字符数组会把常量区的Hello\0的内容复制进str1在栈区的内存空间中。
而于p1是指针变量,又由于字符串常量在源代码中代表了其所在常量区的地址,p1保留这个地址,所以通过p1就可以找到这个字符串常量。如果此时给它赋值(例p1[0] = ‘h’;),会执行失败。因为p1指向的是常量区的地址,常量区的内容是不可以被修改的。
但是可以p1 = “world”;,因为p1是指针变量,它们可以指向任意的字符串。
例:
//下面叙述错误的是()
char acX[]="abc";
char acY[]={'a','b','c'};
char *szX="abc";
char *szY="abc";
正确答案为:szX的内容修改后,szY的内容也会被更改
解释:
acX , acY 是2个数组,属于变量,一般存在栈区,可以修改, szX , szY 是2个指针指向常量区,常量区的东西不能被修改,所以是错误的
例:
以下叙述中正确的是()
语句 char str[10] = “string!”; 和 char str[10] = {“string!”}; 并不等价(错误)
答案为
对于字符串常量 “string!”,系统已自动在最后加入了"\0"字符,表示串结尾
易错点
易错点:
sizeof 函数求得是占据内存大小,strlen 函数求的是实际长度。
总结
这就是我大概的理解,字符串这里虽然看似简单,但里面弯弯绕还是不少的。