我们经常在例程中看到这样的情况:
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