zoukankan      html  css  js  c++  java
  • C语言进阶—— 单引号和双引号14

    单引号和双引号

    • C语言中的单引号用来表示字符字面量
    • C语言中的双引号用来表示字符串字面量

    ‘a’表示字符字面量,在内存中占用一个字节,'a'+1表示'a'的ASCII码加1,结果为'b'

    "a"表示字符串字面量,在内存中占用2个字节,"a"+1表示指针运算,结果指向"a"结束符''

    请思考下面这段代码是否合法?

      char *p1 = 1;

      char *p2 = '1';

      char *p3 = "1";

    实例分析:

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5 
     6     char* p1 =  1 ;
     7     char* p2 = '1';
     8     char* p3 = "1";
     9 
    10     printf("%s, %s, %s", p1, p2, p3);
    11     
    12     printf('
    ');
    13     printf("
    ");
    14     
    15     return 0;
    16 }

    这段代码会出现段错误,为什么呢?请先看一下下面的小贴士:

    • 字符字面量被编译为对应的ASCII码
    • 字符串字面量被编译为对应的内存地址
    • printf 的第一个参数被当成字符串内存地址
    • 内存的低地址空间不能随意在程序中随意访问

    我们再来分析一下,上面的代码,p1指针和p2指针其实指向的是字符字面量,存贮于低地址,所以第10行代码会出现段错误;

    第12行,由于' '也是一个字符字面量,所以也是存贮于低地址,由于低地址不能随意的访问,所以也会出现段错误。

    我们再来看一个示例:

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5 
     6     char c = " ";
     7     
     8     while( (c == "	") || (c == " ") || (c == "
    ") )
     9     {
    10         scanf("%c", &c);
    11     }
    12     
    13     return 0;
    14 }

    char c = "string";

    这段代码发生了什么?分析:

    1. 编译后字符串"string"的内存地址值被赋值给变量c
    2. 内存地址占用四个字节,而变量c值占用一个字节
    3. 由于类型不同,赋值后产生截段

    由于while中的等号右边都是字符串字面量,也就是地址,存贮于高地址,而一个字节的c最大的值也就是255,所以while循环条件不可能被满足

    小结:

    • 单引号括起来的单个字符代表整数
    • 双引号括起来的字符代表字符指针
    • C编译器接受字符和字符串的比较,无任何意义
    • C编译器允许字符串对字符变量进行赋值,只能得到错误
  • 相关阅读:
    Jdbc 事务
    Spring
    【Java集合的详细研究1】Collections类常用方法总结
    Java Number类
    Java中值类型和引用类型的区别
    Java常量池的理解
    Java重写与重载之间的区别
    Java中Animal b = new Dog();Dog c = new Dog();的区别
    java类构造器的理解
    Javascript history pushState onpopstate方法做AJAX SEO
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9405037.html
Copyright © 2011-2022 走看看