C语言中const的正确用法

今天看《Linux内核编程》(Claudia Salzberg Podriguez等著)时,文中(p39)有一个错误,就是关于const的用法。

原文中举例说明:const int *x中x是一个指向const整数的指针,因此可以修改该指针,不可以修改这个整数。而在int const *x中,x却是一个指向整数的const指针,因而这个整数可以改变,但是指针不可以改变。本来我也对这个不是很懂,于是就写了个测试例子测了一下:

测试一,const int *x,代码如下:

1     int b = 1,a=3;
2     const int *c = &a;
3     c = &b;
4     printf("c is %d\n",*c);

测试结果:c is 1,即,指针可以修改

修改下:

1      int b = 2;
2     const int *c = &b;
3     *c = 5;
4     printf("c is %d\n",*c);

测试结果,编译错误(GCC):

line 3 , error: assignment of read-only location '*c'

由此证明该书中对于 const int *x的描述是正确的,然而问题在于对 int const *x 的描述:”因而这个整数可以改变,但是指针不可以改变“ 却是错误的。

测试二:

1     int g = 22;
2     int const *d;
3     d = &g;
4     int f = 23;
5     d = &f;
6     printf("d is %d\n",*d);

测试结果 d is 23,这个指针是可以改变的!

改一下:

1     int g = 22;
2     int const *d;
3     d = &g;
4     *d = 12;
5     printf("d is %d\n",*d);

测试结果,编译错误(GCC)

line 4 , error: assignment of read-only location '*d'

所以,const int *x 和 int const *x是一样的,他们都是一个指向const整数的指针,可以修改该指针,但是不能修改这个整数。

这篇文章也得出相同结论。

那么正确的:”指向一个整数的const指针,即整数可变,指针不可变“ 用const应该怎么定义?

测试三:

1      int g = 22;
2     int * const d = &g;
3     int e = 24;
4     d = &e;
5     printf("d is %d\n",*d);

结果:编译出错:

line 4 error: assignment of read-only variable 'd'| 即:不能改变指针d

改一下:

1      int g = 22;
2     int * const d = &g;
3     *d = 24;
4     printf("d is %d\n",*d);

测试结果:

d is 24,即可以修改整数。

所以int * const x 是 指向一个整数的const指针,即整数可变,指针不可变。

 

结论:

所以我们可以简单记下这个规则,const 直接修饰的才是只读的,不可变的,

对于const int *x 和 int const *x,const直接修饰的应该是”整型“,所以,这个整数不可变,但是这个指针可变。

对于int * const x,const直接修饰的应该是”指针x“,所以,这个指针不可变,但是这个整数可变。

/* 全文原创,转载请注明出处,如果有不同看法或者问题欢迎随时评论给我。^_^ */

posted @ 2014-03-16 15:53  april吖~  阅读(950)  评论(0编辑  收藏  举报