2

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

    image.png



  • 代码阅读:

      char c = " ";
    
      while(c == "\t" || c == " " || c == "\n")
      {
          scanf("%c", &c);
      }
    

    代码解析:

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

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


bryson
169 声望12 粉丝