在C语言中,字符串常量的直接值,实际上是一个指针,而不是这些字符本身。
可以这么理解,C语言中的字符串是一串以'\0'
结尾的字符组成的数组。而数组和指针某种意义上是等价的。
也就是说,字符串常量"abcd"
在表达式中实际上代表的值是该字符串第一个字符的地址。这同时也解释了为什么字符串常量可以直接赋给指针,而不能赋给数组。
测试代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <stdio.h>
int main(void) { int a = "abcd";
char *ptr = "abcd";
printf("ptr: %x\n", ptr); printf("\"abcd\": %x\n", "abcd"); printf("ptr+1: %x\n", ptr + 1); printf("\"abcd\"+1: %x\n", "abcd" + 1); printf("*\"abcd\"=%x\n", *"abcd"); printf("*(\"abcd\"+1)=%x\n", *("abcd"+1)); if (ptr == "abcd") { printf("ptr==\"abcd\"\n"); } return 0; }
|
得到的警告信息说明,字符串常量实际是char *
类型:
![warning]()
输出结果如下:
![result]()