• 第14课 单引号和双引号


    1. 单引号和双引号

    (1)C语言中单引号用来表示字符字面量(是个数值

    (2)C语言中双引号用来表示字符串字面量(是个指针

      ①'a'表示字符字面量(97),在内存中占用1个字节,'a'+1表示'a'的ASCII码加1,即'b'

      ②"a"表示字符串字面量(是个指针),在内存中占2个字了,"a"+1表示指针运算,指向"a"的结束符""

    【实例分析】单引号与双引号的本质

    #include <stdio.h>
    
    int main()
    {
    
        char* p1 =  1 ;//p1=0x0000001,内存低地址,不可访问
        char* p2 = '1';//p2=0x0000031,内存低地址,不可访问
        char* p3 = "1";//p3=0x008A5860,合法地址
    
        printf("*p1=%s
    ", p1); //段错误,内存不可访问
        printf("*p2=%s
    ", p2); //段错误,内存不可访问
        printf("*p3=%s
    ", p3);   //合法,*p3==1
    
        printf('
    ');    //段错误,'
    '表示10,即内存0x000000A处的内存值
        printf("
    ");    //合法,打印换行
        
        return 0;
    }

    小贴士】

    (1)字符字面量被编译为对应的ASCII码

    (2)字符串字面量被编译为对应的内存地址

    (3)printf的第一个参数被当成字符串内存地址

    (4)内存的低地址空间不能在程序中随意访问

    【实例分析】混淆概念的代码

    #include <stdio.h>
    
    int main()
    {
        //错误的方法
        char c = " ";//将空字符串指针的低地址1个字节的数值赋给c
        //分别与"	"、空字符串、
    的指针的1个字节比较,显然不等
        while( (c == "	") || (c == " ") || (c == "
    ") )
        {
            scanf("%c", &c);
        }
    
        //正确的方法
        char c = ' '; //将空字符的ASCII码赋给c
        //c分别与制表符、空格、
    的ASCII码比较
        while ((c == '	') || (c == ' ') || (c =='
    '))
        {
            scanf_s("%c", &c);
        }
        
        return 0;
    }

        ▲分析  char c = "string";发生了什么

      ①编译后字符串"string"的内存地址被赋值给变量c

      ②内存地址占用4个字节,而变量c只占用1个字节,由于类型不同,赋值后产生截断

    2. 小结

    (1)单引号括起来的单个字符代表整数

    (2)双引号括起来的字符代表字符指针

    (3)C编译器接受字符和字符串的比较,但无任何意义

    (4)C编译器允许字符串对字符变量赋值,只能得到错误

  • 相关阅读:
    jquery判断<inpur type="checkbox" checked>是否被选择
    hibernate多对多的更新问题
    关于getHibernateTemplate().get()方法
    springmvc的@ResponseBody报错
    @RequestBody ajax 415 400
    js判断浏览器的类型,动态调整div布局
    平衡树treap 0基础详解
    P1582 倒水 题解
    vscode入门记
    P5025 [SNOI2017]炸弹 题解
  • 原文地址:https://www.cnblogs.com/5iedu/p/5323602.html
Copyright © 2020-2023  润新知