关于c:C进阶14单引号和双引号

7次阅读

共计 1149 个字符,预计需要花费 3 分钟才能阅读完成。

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 语言进阶课程》。
如有错漏之处,恳请斧正。

正文完
 0