C语言const与指针——为什么不能用char **给const char **赋值

作者: sunnylgz
发布时间:2015-07-07 16:45:59

C语言中,const限定词指定了一个不可修改的变量,但并不是常量。它可以使编译器帮助我们保证某些变量不被意外修改,例如指针或引用传递时,加上const可保证我们的源数据不被破坏。const修饰指针时情况比一般情况下要复杂许多,先看下面这个例子:

1 const char * p1;//p1指向的内容不可变
2 char const * p2;//p2指向的内容不可变
3 char * const p3;//p3不可变,但其指向的内容可变

通过注释可以看出,当const在*前时,其修饰的是指针指向的内容,但指针本身是可变的,我们可以用它来遍历一个源数组或其他一组不想被意外破外的数据;当const在*后时,其修饰的是指针本身,但其指向的内容是可变的,在这个意义上,它类似于数组名,但二者并不完全等价

在任何情况下,都可以向const T类型的指针传入T型的指针(T表示任意数据类型),但反过来却不行。原因很简单,如果反来过可行,我们就可以借助普通指针来修改const型指针指向的内容,这恐怕不是我们想要的结果。但是这条规则是否适用于const修饰的二级指针呢?比如给const char **的指针传入一个char **的值,会不会保证万无一失呢?这种情况下编译器一般会给出一个warning,曾以为这个warning是无关紧要的,只是编译器太敏感了,只到后来看来这个例子,我才仿佛明白了什么:

1 const char c = 'x';
2 char *p1;
3 const char **p2 = &p1;//用char **的值赋给const char **
4 *p2 = &c;//用const char * 给const char *赋值,完全没问题
5 *p1 = 'y';//给char *指向的内容赋值,没问题!但这儿会发生什么事情

除了第3行出有一个warning外,其余的都没任何问题,但是经过第4步的操作,p1已经指向的c,这是一个不可修改的变量,第5步!!!天哪,我干了些什么??

标签: C语言
来源:http://www.cnblogs.com/sunnylgz/archive/2011/08/02/2125089.h

推荐: