1 C、C++中的单引号和双引号
1.1 C、C++中的单引号和双引号
C、C++中的单引号和双引号作用如下:
- 单引号用来表示字符字面量,单引号括起来的带个字符代表整数。
- 双引号用来表示字符串字面量,双引号括起来的若干个字符代表字符指针。
比如:

1.2 单引号和双引号的错误使用举例
举例一:单引号和双引号的本质
如下程序片段合法吗?

#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;
}
为了解释为何会出现段错误,我们需要知道如下知识:
- 字符字面量被编译为对应的ASCII码。
- 字符串字面量被编译为对应的内存地址。
- printf的第一个参数被当成字符串内存地址。
- 内存的低地址空间不能再程序中随意访问。
我们可以得到如下的内存图,段错误的原因也就显而易见了:


举例二:混淆概念的代码
#include <stdio.h>
int main()
{
char c = " ";
while( (c == "\t") || (c == " ") || (c == "\n") )
{
scanf("%c", &c);
}
return 0;
}
// 运行结果:程序直接执行结束,不会接收用户的输入。
为了理解上述运行结果,我们需要运行结果,我们需要知道char c = "string"发生了什么?
分析:
- 编译后字符串“string”的内存地址被赋值给变量c。
- 内存地址占用4个字节,而变量c只占用1个字节。
- 由于类型不同,赋值后产生截断。
注意:
- C编译器接受字符和字符串的比较,无任何意义。
- C编译器允许字符串对字符变量赋值,只能得到错误。
参考资料:
本文深入探讨了C和C++中单引号与双引号的区别,解析了字符字面量与字符串字面量的概念,并通过实例展示了错误使用可能导致的段错误。同时,文章还解释了字符和字符串在内存中的表现形式,帮助读者避免常见的编程陷阱。
1万+





