zoukankan      html  css  js  c++  java
  • 放弃"指针常量"这种不严谨的中文描述!深度理解数组名、指针常量

    ques1: 数组名完全等价于指针常量吗?
    int array[10] = { 10,11,12,13,14,15 };    
    printf("sizeof(array)= %d 
    ", sizeof(array));
    
    char* const str_2 = "QQQQQQQQQQQQQQ";
    printf("sizeof(str_2)= %ld 
    ", sizeof(str_2));
    // 此实验说明虽然数组名的实现 和 指针常量(例如char* const p)很类似, 但在编译器眼里,仍然是有区别的:
    // sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台) 
    // 知道这个区别就行,下次和别人聊天,不要把数组名完全等价为指针常量。
    
    
    ques2: C语言的指针常量,是真常量吗?
    char** pp = (char**)(&str_2);
    char data = 'c';
    *pp = &data;
    printf("str_2 = %c 
    ", str_2[0]);
    //实测,指针str_2的指向可以被修改,所以在C语言中,中文表达的所谓“指针常量”这个称呼并不准确。
    //C语言内的常量只有字面常量和枚举值。 ( PS:注意,要区分 枚举值 和 枚举变量(注意,要区分 枚举值 和 枚举类型定义的变量 ) )

    指针常量和常量指针,这俩中文表述其实并不严谨。但是也有方法来理解其意思。

    所谓指针常量,侧重点是常量,int* const p,p就是这里所谓的常量。

    所谓常量指针,侧重点是个指针,const int* p;

    很显然,数组名更贴近 int* const p, 绝对不是const int* p,所以更贴近指针常量的称呼。

     

    但是需要补充:

    1. 在C语言中,中文表达的所谓“指针常量”这个称呼并不准确,指针常量,并不是常量。

       C语言内的常量只有字面常量和枚举值(注意,要区分 枚举值 和 枚举类型定义的变量 )。

    2.数组名并不完全等价于指针常量。依据: sizeof(数组名)等于数组大小, 而sizeof(指针常量)等于4字节(32位平台)或8字节(64位平台)


    小结:
    放弃"指针常量"这种看似精简实则简陋的中文描述吧!
    我们应该使用英文来描述:

    Pointer to constant:
    const int *ptr;
    int const *ptr;W
    
    Constant pointer to variable:
    int *const ptr;
    
    constant pointer to constant:
    const int *const ptr;

    .

    /************* 社会的有色眼光是:博士生、研究生、本科生、车间工人; 重点大学高材生、普通院校、二流院校、野鸡大学; 年薪百万、五十万、五万; 这些都只是帽子,可以失败千百次,但我和社会都觉得,人只要成功一次,就能换一顶帽子,只是社会看不见你之前的失败的帽子。 当然,换帽子决不是最终目的,走好自己的路就行。 杭州.大话西游 *******/
  • 相关阅读:
    Spring Security【一】 ------ 前后端分离开发
    mybatis 使用mybatis-plus-generator进行代码自动生成
    VuejsApp简介
    BeetleX之Vue ElementUI生成工具
    BeetleX数据分析中间服务V3
    vuejs集成echarts的一些问题
    BeetleX使用bootstrap5开发SPA应用
    BeetleX大数据之产品分析服务
    小试牛刀ElasticSearch大数据聚合统计
    在windows 10的ubuntu系统上如何使用dd命令写u盘?
  • 原文地址:https://www.cnblogs.com/happybirthdaytoyou/p/13729120.html
Copyright © 2011-2022 走看看