C专家编程 二 const

       关键字const并不能把变量变成常量!在一个符号前加上const限定符只是表示这个符号 不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚 至是外部)的方法来修改这个值。const最有用之处就是用它来限定函数的形参,这样该函数 将不会修改实参指针所指的数据,但其他的函数却可能会修改它。这也许就是C和C++中 const最一般的用法。
const可以用在数据上,如:
const int limit = 10;
这和其他语言差不多,但当你在等式两边加上指针,就有一定难度了:

const int * limitp = &limit ;

int i = 27;

limitp = &i;

        这段代码表示limitp是一个指向常量整型的指针。这个指针不能用于修改这个整型数, 但是在任何时候,这个指针本身的值却可以改变。这样,它就指向了不同的地址,对它进行 解除引用(dereference)操作时会得到一个不同的值!
const和*的组合通常只用于在数组形式的参数中模拟传值调用。它声称“我给你一个指 向它的指但你不能修改它。”这个约定类似于极为常见的void *的用法,尽管在理论上 它可以用于任何情形,但通常被限制于把指针从一种类型转换为另一种类型。
        类似地,你可以取一个const变量的地址,并且可以...(唔,我最好不要往大家的脑 袋里灌输这种思想)。正如Ken Thompson所指出的那样,“const关键字可能引发一些 罕见的错误,只会混淆函数库的接口。”回首往事,const关键字原先如果命名为readonly 就好多了。

        C语言的声明所存在的最大问题是你无法以一种人们所习惯的自然方式从左向右阅读-一 个声明,在ANSI C引入volatile和const关键字后,情况就更糟糕了。由于这些关键字只能 出现在声明中(而不是使用中),这就使得现今声明形式和使用形式能完全对得上号的例子越 来越少了。那些从风格上看像是声明,但却没有标识符的东西(如形式参数声明和强制类型 转换)看上去显得滑稽。如果想要把什么东西的类型强制转换为指向数组的指针,就不得不 使用下面的语句来表示这个强制类型转换:

char (*j) [20] ; /* :i是一个指向数组的指针,数组内有20个char元素。

j = (char (”[20]) malloc(20);

如果把星号两边看上去明显多余的括号拿掉,代码会变成非法的。

涉及指针和const的声明可能会出现几种不同的顺序:

const int * grape;

int const * grape;

int * const grape_jelly;

        在最后一种情况下,r旨针是只读的,而在另外两种情况下,指针所指向的对象是只读的。 当然对象和指针有可能都是只读的,下面两种声明方法都能做到这一点:

const int * const grape_jam;

int const * const grape_jam;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值