指针与const限定符(Linux C编程)

我们经常在例程中看到这样的情况:

char *a = 'a';

func(a);//func原型是void func(const char *)

为什么函数形参中的指针多数是用const限定符来修饰的呢?以下的讨论会为你揭开谜底

const限定符和指针结合起来常见的情况有以下几种。

1.

*********************************************************************

const int *a;

int const *a;

*********************************************************************

这两种写法是一样的,a是一个指向const int型的指针,a所指向的内存单元不可改写,所以(*a)++是不允许的,但指针a本身可以改写,即a可以指向别的内存单元,a++是允许的。

例如:const int para = 10;

const int *a = ¶

此时,由于para是常量,对于a的解引用(*a)++等价于para++,显然是非法的。

2.

*****************************************************************************

int * const a;

******************************************************************************

a是一个指向int型的const指针,*a是可以改写的,但a本身不允许改写。

例如:int para = 10;

int * const a = ¶

此时,指针a的值是para的地址常量不可更改,所以显然a++是非法的;

3.

***************************************************************************************

int const * const a;

***************************************************************************************

a是一个指向const int型的const指针,因此*a和a本身都不允许改变,即:a++、(*a)++都是非法的。

const指针变量和非const指针变量之间的相互转换

指向非const变量的指针可以隐式转换成const变量的指针例如:

***************************************************************************************

int para = 10;

const int *a = ¶

*************************************************************************************

但是,指向const变量的指针不可以隐式转换成指向const变量的指针,以免通过后者意外改写了前者所指向的内存单元,例如如下程序编译器就会报警:

*******************************************************************************************

const int para = 10;

int *a = ¶

*****************************************************************************************

当然不用const限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const限定符,理由如下:

1. const给读代码的人传递非常有用的信息。比如一个函数的参数是const char *,你在调用这个函数的时候就可以放心给它传递char*或const char*类型指针,而不必担心指针所指的内存单元被改写,因为该函数无法通过它的形参改写你传给他的内存单元。

2. 尽可能多地使用const限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。

3. const对编译器优化是一个很有用的提示,编译器也许会把const变量优化成常量。

再上一个例子:

我们知道printf函数原型的一个参数类型就是const char *型,可以把char *或const char *指针传给它,所以下面这些调用都是合法的:

************************************************************************************************

const char *p = "abcd";

char str[5] = "abcd";

printf("%s\n",p);

printf("%s\n",str);

*****************************************************************************************************

综上所述,文章开头给的例程,相信各位已经有了答案!

参考文献:《Linux C编程一站式学习》宋劲杉著 电子工业出版社 P335—P336






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值