一个字符在内存中只占一字节,而字符串本质上是多个字符组成的字符数组。C语言规定,在每一个字符串常量的结尾,系统都会自动加一个字符'/0'作为该字符串的“结束标志符”,系统据此判断字符串是否结束。这里要特别强调一点:'/0'是系统自动加上的,不是人为添加的。
'/0' 是 ASCII 码为 0 的字符,它不会引起任何控制动作,也不是一个可以显示的字符。比如字符串常量"CHINA",表面上看它只有 5 个字符,但实际上它在内存中占 6 字节,'C'、'H'、'I'、'N'、'A'、'/0' 各占一字节。如果要输出该字符串,'/0' 不会输出。也就是说,虽然实际上总共有 6 个字符,'/0' 也包括在其中,但输出时 '/0' 不会输出。系统从第一个字符 'C' 开始逐个输出字符,直到遇到 '/0',则表示该字符串结束,停止输出。
也就是说,在字符串常量中,如果“双撇号”中能看见的字符有 n 个,那么该字符串在内存中所占的内存空间为 n+1 字节。
下面写一个程序验证一下:
# include <stdio.h> int main(void) { printf("%d/x20", sizeof("")); printf("%d/x20", sizeof("a")); printf("%d/x20", sizeof("CHINA")); printf("%d/x20", sizeof("How are you")); printf("%d/x20", sizeof("I love you")); printf("%d/n", sizeof("你好")); return 0; }
输出结果是:
1 2 6 12 11 5
第一个“双撇号”中什么都不写,则只有 '/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 字节。
不能将一个字符串常量赋给一个字符变量
为什么不能将一个字符串常量赋给一个字符变量?可以从两个方面作出解释:
- 前面讲过,字符变量用 char 定义。一个字符变量中只能存放一个字符。而字符串一般都有好多字符,占多字节。所以不能将多个字符赋给只占一字节的变量。那么如果字符串常量的双撇号内什么都不写,此时就只有一个字符 '/0',那么此时可不可以将它赋给字符变量?不可以!原因看下面第二点。
- 字符串是指一系列字符的组合。在 C 语言中,字符变量的类型用 char 定义。我们这里讲的是数据类型,但是字符串不属于数据类型,也就不存在字符串变量。一种类型的变量要想存储某个对象,必须能兼容该对象的数据类型,而字符串连数据类型都算不上,又怎么能将它赋给字符变量呢?所以在 C 语言中,任何数据类型都不可以直接存储一个字符串。那么字符串如何存储?在 C 语言中,字符串有两种存储方式,一种是通过字符数组存储,另一种是通过字符指针存储。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/21531.html