字符串与字面串有什么区别?
——答:
字符串:字符串在C语言中通常表示为字符数组,即一串字符的集合。字符串的结尾通常以空字符('\0')标识,用于标记字符串的结束。例如:
char str[] = "Hello, world!";
这是一个字符串,包含了一系列的字符和一个空字符作为结尾。
字面串:字面串也称为字符串常量,它是在代码中直接写出的字符串。字面串在C语言中是作为字符数组处理的,并且在编译时会被分配存储空间。例如:
char *str = "Hello, world!";
这是一个字面串,它在代码中直接给出了一个字符串常量。这里使用了指针来存储字面串的地址。
它们的主要区别在于:
字符串是字符数组,可以通过字符数组来操作;而字面串是常量,不可修改。
字符串可以使用字符数组来定义和操作,而字面串则使用指针来指向其存储位置。
字面串在编译时会被分配存储空间,而字符串则是在运行时动态分配的。
如何延续字面串?
——答:如果发现字面串太长了不能单独放置在一行内,那么只需要把第一行的结尾加上字符 \ 即可,这样C语言就允许在下一行延续字面串。例如:
printf("Do not go gentle into the good nignt, \
old age should burn and rave at close of day.");
一般而言,通过行尾加字符\的方式可以把两行乃至更多行代码链接成一行,这个过程在C标准中称为“拼接”splicing.
但是使用 \ 有一个缺陷:那就是字面串必须从下一行起始位置继续,但这破坏了程序的缩进结构。不过还有更好的方法:当两条或更多字面串相邻时(仅用空格字符分开),编译器会把它们合并成一条字符串。因此可以怎么写:
printf("Do not go gentle into the good nignt,"
"old age should burn and rave at close of day."
"Rage, rage against the dying of light.");
printf函数调用与scanf函数调用中使用的字面串作为参数怎么进行传递的?
——答:为此我们需要了解字面串如何储存。
究极本质,C语言是将字面串作为字符数组来处理的。当C语言编译器在程序中遇到长度为n的字面串时,它会为其分配n+1长度的储存空间,其中n字符长度的空间用于储存字面串内容其末尾额外加上一个空字符'\0'
注意:空字符是一个所有位都位0的字节,因此用转义字符 \0表示,其码值位0,与零字符‘0’不同(零字符在ASCII中码值为48)。
因此既然字面串是作为数组来储存的,那么编译器会把它看作char *类型的指针。所以printf函数与scanf函数都接收char *类型的值作为它们的第一个参数。例如:
printf("abc")
当调用printf函数时,传递的是“abc”的地址即指向存储字母a的内存单元的指针。