问题:当printf函数和scanf函数用字符串字面量作为参数时,传递的是什么呢?
答案:是“字符串字面量”,printf
函数和scanf
函数都接收char *
类型的值作为它们的第一个参数,可参考《scanf 中 & 的应用本质》。在C语言中,字符串字面量是作为数组来存储的,编译器会将它看作是char *
类型的指针。如以下代码:
printf("abc");
当调用printf
函数时,会传递"abc"
的地址(即指向存储字母a的内存单元的指针)。
拓展:
-
本质上,C语言把字符串字面量作为字符数组来处理,当编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间。这块字符空间将用来存储字符串字面量中的字符,以及一个用来标志字符串末尾的额外字符(空字符)。
a = "abc";
字符串字面量“abc”是作为有4个字符的数组来存储的(a、b、c和\0)。
-
空字符(’\0’)是一个所有位都为0的字节,用转义序列\0来表示,它的码值为0; 零字符(‘0’)则有不同的码值(ASCII中为48)。