Summary
1)C语言中的单引号
用来表示字符字面量
;字符字面量的本质是一个整数
;
2)C语言中的双引号
用来表示字符串字面量
;字符串字面量的本质是一个指针(内存地址)
;
3)低于0x08048000
这个值的内存地址都是不能直接访问的,访问就会段错误(可访问的地址值需要大于等于该值,32位系统);
4)注意:char类型
和char*类型
要用正确的字面量进行初始化
;虽然char a = ""; char* s = 'a';都能编译的过,但使用的时候就会出意想不到的段错误
。
5)字符字面量和字符串字面量的混淆使用在C编译器中可以编的过,但要注意warning,工程中对于所有的warning一定都要当成error来处理
。
单引号和双引号
C语言中的单引号
用来表示字符字面量
;字符字面量的本质是一个整数
,'a'在内存中占1个字节,'a'+1 表示'a'的ASCII码值加1,结果为'b'。
C语言中的双引号
用来表示字符串字面量
;字符串字面量的本质是一个内存地址(地址值),"a"在内存中占有2个字节,"a"+1 表示指针运算,结果指向"a"中的结束符'\0'。
代码阅读:
char* p1 = 1; char* p2 = '1'; char* p3 = "1"; printf("%s, %s, %s", p1, p2, p3); printf('\n'); printf("\n");
代码解析:
p1 用一个整数字面量1进行初始化,有warning,但可以编的过,因为指针本质也是一个32(64)位的整数值 p2 用一个字符字面量'1'进行初始化,同p1。字符'1'本质也是一个整数,值为49 p3 用一个字符串字面量"1"进行初始化,字符串字面量的本质是一个指针(内存地址),没有问题 printf(param1, ...)的第一个参数是一个指针,地址值 printf('\n')可以编的过,但是warning,同p2,使用10作为一个地址值传给printf函数 printf("\n")可以编的过,使用一个字符串字面量作为参数,换行 综上:p1 p2 printf('\n')都是可以编的过,但是有问题的语句,在进行打印的使用就会段错误, 因为使用了错误的地址值,访问了不该访问的内存,野指针!!!
代码阅读:
char c = " "; while(c == "\t" || c == " " || c == "\n") { scanf("%c", &c); }
代码解析:
c的初始化:使用一个只有空格字符的字符串字面量进行初始化;实际上是用一个指针(内存地址值)进行初始化 由于char类型占1个字节,指针类型占4字节(32位),所以会发生截断 再去进行while循环的判断,第一次就为false,不会进到循环中 所以要正确判断字符类型和字符串类型,确保使用的类型是正确的: 修改,将"\t"等都改成'\t'。
本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。