字符常量是由一对单撇号括起来的单个字符,如a、D、?、39;。在C语言中,除了字符常量外还有字符串常量,顾名思义就是多个字符串在一起。与字符常量有所不同,字符串常量是用双撇号括起来的多个字符的序列,如Howareyou、Iloveyou、你好。当然,只要是双撇号括起来的,就算只有一个字符也叫字符串,如a。字符常量a与字符串常量a是不同的。 一个字符在内存中只占一字节,而字符串本质上是多个字符组成的字符数组。C语言规定,在每一个字符串常量的结尾,系统都会自动加一个字符作为该字符串的结束标志符,系统据此判断字符串是否结束。这里要特别强调一点:是系统自动加上的,不是人为添加的。 是ASCII码为0的字符,它不会引起任何控制动作,也不是一个可以显示的字符。比如字符串常量CHINA,表面上看它只有5个字符,但实际上它在内存中占6字节,C、H、I、N、A、各占一字节。如果要输出该字符串,不会输出。也就是说,虽然实际上总共有6个字符,也包括在其中,但输出时不会输出。系统从第一个字符C开始逐个输出字符,直到遇到,则表示该字符串结束,停止输出。 也就是说,在字符串常量中,如果双撇号中能看见的字符有n个,那么该字符串在内存中所占的内存空间为n1字节。 下面写一个程序验证一下:includestdio。hintmain(void){printf(d,sizeof());printf(d,sizeof(a));printf(d,sizeof(CHINA));printf(d,sizeof(Howareyou));printf(d,sizeof(Iloveyou));printf(d,sizeof(你好));return0;} 输出结果是: 12612115 第一个双撇号中什么都不写,则只有一个字符,所以只占一字节。 第二个a中有1个可见字符,占2字节。 第三个CHINA有5个可见字符,占6字节。 第四个Howareyou中,空格也是字符,也算是可见的,所以总共有11个可见字符,共占12字节。 第五个Iloveyou共10个可见字符,占11字节。 第六个你好为什么占5字节?有2个可见字符不是应该占3字节吗?C语言规定,1个英文字符占1字节,而1个中文字符占2字节,就算是中文的标点符号也是占2字节。所以两个汉字占4字节,加上总共是5字节。不能将一个字符串常量赋给一个字符变量 为什么不能将一个字符串常量赋给一个字符变量?可以从两个方面作出解释:前面讲过,字符变量用char定义。一个字符变量中只能存放一个字符。而字符串一般都有好多字符,占多字节。所以不能将多个字符赋给只占一字节的变量。那么如果字符串常量的双撇号内什么都不写,此时就只有一个字符,那么此时可不可以将它赋给字符变量?不可以!原因看下面第二点。字符串是指一系列字符的组合。在C语言中,字符变量的类型用char定义。我们这里讲的是数据类型,但是字符串不属于数据类型,也就不存在字符串变量。一种类型的变量要想存储某个对象,必须能兼容该对象的数据类型,而字符串连数据类型都算不上,又怎么能将它赋给字符变量呢?所以在C语言中,任何数据类型都不可以直接存储一个字符串。那么字符串如何存储?在C语言中,字符串有两种存储方式,一种是通过字符数组存储,另一种是通过字符指针存储。 需要注意的是,虽然C语言里面没有数据类型可以存储字符串,但C和Java中都有。