您的位置:首页 > 编程语言 > C语言/C++

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

2013-12-11 12:36 483 查看
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步!!!天哪,我干了些什么??
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: