1 C语言中的单引号和双引号
- C语言中的单引号用来表示字符字面量
- C语言中的双引号用来表示字符串字面量,存储于全局的只读存储区
注意上面的字符与字符串的区别
- 下面的程序片段是否合法?
上面额三行代码,看着像是很正常,实际上问题很大。在具体分析上述代码问题之前,我们先给出一个代码示例来看看:
- 代码 14-1.c
#include <stdio.h>
int main()
{
char* p1 = 1 ;
char* p2 = '1';
char* p3 = "1";
printf("%s, %s, %s", p1, p2, p3);
printf('\n');
printf("\n");
return 0;
}
-
上述代码编译结果如下:
-
在程序员的眼中,警告就是错误上述错误提示告诉我们6行,7行,12行有问题。
-
运行上述可执行程序的话,会产生段错误
由以上的程序以及编译与运行的情况来看,由以下几条知识点需要我们掌握:
- 字符字面量,被编译为对应的ASCII码
- 字符串字面量,被编译为对应的内存地址
- printf() 的第一个参数,被当成是字符串的内存地址
- 内存的低地址空间,不能被随意访问。至于这一点,如下内存图所示:
如上图所示:
-
p1变量的值是0x00000001,地址1是无法访问的。所以第6行有警告 。 地址0x00000001为什么不能访问可以自行google
-
p2变量的值是字符‘1’的ASCII码,也就是31,地址0x00000031也是不能被访问的。(第一条与第二条就印证了内存低地址不能被访问的说法)
-
p3变量的值是字符串“1” 所代表的地址,在这里是0x080484d0 。 这个地址是可以被访问的。
-
至于第12行的警告,是因为 ‘\n’ 的ASCII码值为 10 ,那么printf 的第一个参数就是 10 ,10这个地址同样也是不能被访问到的。
1.1 双引号带来的BUG
代码:14-2.c
#include <stdio.h>
int main()
{
char c = " ";
while( (c == "\t") || (c == " ") || (c == "\n") )
{
scanf("%c", &c);
}
return 0;
}
- 上述代码乍一看没问题,但是编译运行会发现有警告,且运行后并不会执行while循环。
- 主要原因是双引号下空格,表示一个地址的值。一个地址值是占用4字节的,但是字符c是一字节的,会产生截断
- 因为截断了。所以while循环不会成立
2 总结
- 单引号括起来的单个字符代表整数
- 双引号括起来的字符代表字符指针
- 如果使用字符串对字符赋值,就会得到错误的结果