复习c语言深度剖析(14)—单引号和双引号

1. 单引号和双引号

C语言中单引号用来表示字符字面量(是个数值)
C语言中双引号用来表示字符串字面量(是个指针)
‘a’表示字符字面量(97),在内存中占用1个字节,‘a’+1表示’a’的ASCII码加1,即’b’
“a"表示字符串字面量(是个指针),在内存中占2个字了,“a”+1表示指针运算,指向"a"的结束符”\0"
下面的程序片段合法吗?
char *pl = 1; 
char *p2 =‘l’; 
char *p3 = "l ";
2.实例分析

单引号和双引号的本质 
#include

int main()
{

char *p1 =  1 ;  // p1=0x0000001,内存低地址,不可访问
char *p2 = '1';  // p2=0x0000031,内存低地址,不可访问
char *p3 = "1";  // p3=0x008A5860,合法地址

printf("*p1=%s\n", p1); // 段错误,内存不可访问
printf("*p2=%s\n", p2); // 段错误,内存不可访问
printf("*p3=%s\n", p3);   // 合法,*p3==1

printf('\n');    // 段错误,'\n'表示10,即内存0x000000A处的内存值
printf("\n");    // 合法,打印换行

return 0;

}
小贴士:
字符字面量被编译为对应的ASCII码 
字符串字面量被编译为对应的内存地址
printf的第一个参数被当成字符串内存地址 
内存的低地址空间不能在程序中随意访问

内存低于08048000地址不能随便访问,否则段错误,1的ASCII码为31
3.实例分析

混淆概念的代码    
#include

int main()
{
// 错误的方法
char c = " “; // 将空字符串指针的低地址1个字节的数值赋给c
// 分别与”\t"、空字符串、\n的指针的1个字节比较,显然不等
while( (c == “\t”) || (c == " “) || (c == “\n”) )
{
scanf(”%c", &c);
}

// 正确的方法
char c = ' '; // 将空字符的ASCII码赋给c
// c分别与制表符、空格、\n的ASCII码比较
while ((c == '\t') || (c == ' ') || (c =='\n'))
{
    scanf_s("%c", &c);
}

return 0;

}
分析  char c = “string”;发生了什么
编译后字符串"string"的内存地址被赋值给变量c
内存地址占用4个字节,而变量c只占用1个字节,由于类型不同,赋值后产生截断
4. 小结

单引号括起来的单个字符代表整数
双引号括起来的字符代表字符指针
C编译器接受字符和字符串的比较,但无任何意义
C编译器允许字符串对字符变量赋值,只能得到错误
————————————————
版权声明:本文为CSDN博主「小虾米_2018」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22847457/article/details/98737295

你可能感兴趣的:(复习c语言深度剖析(14)—单引号和双引号)