Summary
1)C语言中的单引号
用来示意字符字面量
;字符字面量的实质是一个整数
;
2)C语言中的双引号
用来示意字符串字面量
;字符串字面量的实质是一个指针(内存地址)
;
3)低于0x08048000
这个值的内存地址都是不能间接拜访的,拜访就会段谬误;
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语言进阶课程》。
如有错漏之处,恳请斧正。
发表回复