指针修饰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

posted @ 2013-04-21 01:25  坚固66  阅读(251)  评论(0编辑  收藏  举报