zoukankan      html  css  js  c++  java
  • 指针修饰C语言const修饰符探秘指针修饰

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        

    言前

        C言语是我接触的第一门序程设计言语,时当还很傻很无邪,后来敏捷被各种高级言语洗脑,但是不得不说,C的位置真的无可撼动。

        const修饰符在C言语中很用常,但是近最读代码的时候常常搞不清楚,索搜了一番,做个结总。

        

    体整认知

        

    const是常量修饰符,代码中想法阻挠量变被转变,这个时候可以应用const关键字。必须在声明const量变就初始化,因此,相似与这样的声明是错误的:
    const int i;
    i = 8;

    编译器会报:error: assignment of read-only variable ‘i’。
    我们必需要这样:
    const int i = 8;

    const修饰符的典范作用

    1. 最基本的,护保被修饰的作用,避免之外改修
    2. 编译器常通不为const常量配分存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储和读取内存的作操,效率很高
    3. 使序程中的错误在编译的时候就被报出(因为2)。
    面下会一一举例说明。

        

    const修饰符的修饰对象探秘

        

    修饰通普量变

    const int i = 8;
    int const i = 8;

    面下两者是等价的,都是声了明一个值为5的常量。

    修饰指针

    const int *p;
    int const *p;

    面下两个是等价的,都声了明一个const int类型的指针,也就是说,序程里头不能转变*p的值,但是可以转变p的值(即可以转变指针的指向)。
    int * const p = &n;

    这个是声了明一个const的指针,const是修饰指针的。也即p的值不允许转变(指针就定一得指向n那块内存,不能转变p的指向),但是*p的值可以转变。

    小巧技

        

    • const在*的侧左,const修饰指针所指的量变
    • const在*的侧右,const修饰指针本身

    带const修饰的数函参形

        

    首先要明白一点,非指针参数(值递传)传给数函的是参数的一份拷贝,本身就不会转变参数的值,所以加上const是没有意义的,例如:
        每日一道理
    微笑着,去唱生活的歌谣,不要埋怨生活给予了太多的磨难,不必抱怨生命中有太多的曲折。大海如果失去了巨浪的翻滚,就会失去雄浑;沙漠如果失去了飞沙的狂舞,就会失去壮观。人生如果仅去求得两点一线的一帆风顺,生命也就失去了存在的意义。
    #include <stdio.h>
    
    void add(const int a)
    {
            a = a + 1;
    }
    
    int main()
    {
            int temp = 34;
            add(temp);
            printf("%d",temp);
            return 0;
    }

    虽然编译过不去,但是,就算不加const,在数函体中胜利试尝改修了a,但是在本例中temp的值也是变不的,因为数函中改修的是a的一个拷贝(值递传)。

        

    先看这个数函:
    void foo(const int * p)
    {
            *p += 1;
    }

    编译时就会报错,因为我们试图改修一个常量的值。
    带const的参形是不允许在数函体内改修其值的(只读)。

        

    不过一旦这样写就没辙了:
    void foo(const int * p)
    {
            int *r = p;
            *r += 1;
    }

    虽然编译器编译时会告知你:warning: initialization discards qualifiers from pointer target type,说你赋值丢了一个性属修饰符,但是运行时还是可以转变p所指向内存的值。
    再看这样一个例子:
    void foo(int *const p1) {
        int a = 1;
        p1 = &a; 
    }

    然显编译不过去。这样做本来是想传进来一个const的指针,但实际上,这样是没有意义的。指针作为参数时也是传进去一个指针的拷贝。所以即使不加const,数函体中也是改修的这个“指针的拷贝”。这个数函实际上和本大节扫尾的例子是没区分的(但是这个指针的拷贝所指向的内容可是和被拷贝的西东是一样的)。

        

    可以用面下的图说明:

        


        

    和这个是相似的:

        


        


        


        

     

    文章结束给大家分享下程序员的一些笑话语录: Google事件并不像国内主流媒体普遍误导的那样,它仅仅是中国Z府和美国公司、中国文化和美国文化甚至中国人和美国人之间的关系,是民族主义和帝国主义之间的关系;更重要的是,它就是Z府和公司之间的关系,是权力管制和市场自由之间的关系。从这个意义上说,过度管制下的受害者,主要是国内的企业。Google可以抽身而去,国内的企业只能祈望特区。www.ishuo.cn

  • 相关阅读:
    无缘无故出现IDEA无法引入包和类的问题?
    JDK8新特性——Optional
    【工具类】ExcelUtils
    【Mybatis-Plus学习笔记(二)】查询
    【Mybatis-Plus学习笔记(一)】入门
    【Mybatis学习笔记】目录
    【超详细全过程】DataGrip的安装与使用
    【超详细全过程】python环境配置+编辑器安装(python+pycharm)
    【Mybatis工具(五)】雪花算法
    【Mybatis工具(四)】UUID实现原理及其Java实现
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3033400.html
Copyright © 2011-2022 走看看