C语言的单引号和双引号实例讲解
程序员文章站
2022-07-28 14:34:15
c语言中的单引号用来表示字符字面量
c语言中的双引号用来表示字符串字面量
例如:
'a'表示字符字面量,占1个字节,'a' + 1表示 'a'的asc...
c语言中的单引号用来表示字符字面量
c语言中的双引号用来表示字符串字面量
例如:
'a'表示字符字面量,占1个字节,'a' + 1表示 'a'的ascii码加1,结果为'b'
"a"表示字符串字面量,占两个字节,"a" + 1表示指针运算,结果指向"a"的结束符'\0'
来看一段下边的代码:
#include 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 int main() { char c = " "; while( (c == "\t") || (c == " ") || (c == "\n") ) { scanf("%c", &c); } return 0; }
提示:char c = "string"发生了什么?
-编译后字符串"string"的内存地址被赋值给变量c
-内存地址占用4个字节,而变量c只占用1个字节
-由于类型不同,赋值后产生截断
总结:
1、单引号括起来的字符代表字符指针
2、双引号括起来的字符代表字符指针
3、c编译器接受字符和字符串的比较,无任何意义
4、c编译器允许字符串对字符变量赋值,只能得到错误