【C进阶】14、单引号和双引号

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')都是可以编的过,但是有问题的语句,在进行打印的使用就会段错误, 因为使用了错误的地址值,访问了不该访问的内存,野指针!!!


  • 【【C进阶】14、单引号和双引号】代码阅读:
    char c = " "; while(c == "\t" || c == " " || c == "\n") { scanf("%c", &c); }

    代码解析:
    c的初始化:使用一个只有空格字符的字符串字面量进行初始化;实际上是用一个指针(内存地址值)进行初始化 由于char类型占1个字节,指针类型占4字节(32位),所以会发生截断 再去进行while循环的判断,第一次就为false,不会进到循环中所以要正确判断字符类型和字符串类型,确保使用的类型是正确的: 修改,将"\t"等都改成'\t'。

本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。

    推荐阅读