【字符串】C语⾔_字符串常量详解
字符常量是由⼀对单撇号括起来的单个字符,如 'a'、'D'、'?'、'$'。在 C 语⾔中,除了字符常量外还有字符串常量,顾名思义就是多个“字符”串在⼀起。与字符常量有所不同,字符串常量是⽤“双撇号”括起来的多个字符的序列,如"How are you"、"I love you"、"你好"。当然,只要是“双撇号”括起来的,就算只有⼀个字符也叫字符串,如"a"。字符常量 'a'与字符串常量"a"是不同的。
⼀个字符在内存中只占⼀字节,⽽字符串本质上是多个字符组成的字符数组。C语⾔规定,在每个字符串常量的结尾,系统会⾃动加⼀个字符'\0'作为该字符串的”结束标识符“,系统据此判断字符串是否结束。这⾥要强调⼀点,结束标识符是系统⾃动加上的,不是⽤户⾃⼰加的。
'\0' 是码为 0 的字符,它不会引起任何控制动作,也不是⼀个可以显⽰的字符。⽐如字符串常量"CHINA",表⾯上看它只有 5 个字符,但实际上它在内存中占 6 字节,'C'、'H'、'I'、'N'、'A'、'\0' 各占⼀字节。如果要输出该字符串,'\0' 不会输出。也就是说,虽然实际上总共有 6 个字符,'\0' 也包括在其中,但输出时 '\0' 不会输出。系统从第⼀个字符 'C' 开始逐个输出字符,直到遇到 '\0',则表⽰该字符串结束,停⽌输出。也就是说,在字符串常量中,如果“双撇号”中能看见的字符有 n 个,那么该字符串在内存中所占的内存空间为 n+1 字节。
下⾯写程序验证⼀下:
1 #include <stdio.h>
2int main(void)
3 {
4    printf("%d\x20", sizeof(""));//\x20 输出控制符表⽰空格
5    printf("%d\x20", sizeof("a"));
6    printf("%d\x20", sizeof("CHINA"));
7    printf("%d\x20", sizeof("How are you"));
8    printf("%d\x20", sizeof("I love you"));
9    printf("%d\n", sizeof("你好"));
10return0;
11 }
输出结果:
第⼀个“双撇号”中什么都不写,则只有 '\0' ⼀个字符,所以只占⼀字节。
第⼆个"a"中有 1 个可见字符,占 2 字节。
第三个"CHINA"有 5 个可见字符,占 6 字节。
第四个"How are you"中,空格也是字符,也算是可见的,所以总共有 11 个可见字符,共占 12 字节。
第五个"I love you"共 10 个可见字符,占 11 字节。
第六个"你好"为什么占 5 字节?有 2 个可见字符不是应该占3字节吗?C 语⾔规定,1 个英⽂字符占 1 字节,⽽ 1个中⽂字符占 2 字节,就算是中⽂的标点符号也是占 2 字节。所以两个汉字占 4 字节,加上 '\0' 总共是 5 字节。
不能将⼀个字符串常量赋给⼀个字符变量
为什么不能将⼀个字符串常量赋给⼀个字符变量?可以从两个⽅⾯作出解释:
1. 前⾯讲过,字符变量⽤ char 定义。⼀个字符变量中只能存放⼀个字符。⽽字符串⼀般都有好多字符,
占多字节。所以不能将多个字符
赋给只占⼀字节的变量。那么如果字符串常量的双撇号内什么都不写,此时就只有⼀个字符 '\0',那么此时可不可以将它赋给字符变量?不可以!原因看下⾯第⼆点。
2. 字符串是指⼀系列字符的组合。在 C 语⾔中,字符变量的类型⽤ char 定义。我们这⾥讲的是数据类型,但是字符串不属于数据类型,
c语言定义一个字符串
也就不存在字符串变量。⼀种类型的变量要想存储某个对象,必须能兼容该对象的数据类型,⽽字符串连数据类型都算不上,⼜怎么能将它赋给字符变量呢?所以在 C 语⾔中,任何数据类型都不可以直接存储⼀个字符串。那么字符串如何存储?在 C 语⾔中,字符串有两种存储⽅式,⼀种是通过字符数组存储,另⼀种是通过字符存储。
需要注意的是,虽然 C 语⾔⾥⾯没有数据类型可以存储字符串,但和中都有。