初学C中的const时遇到的一些疑惑和解决

这里说的Const 是 C 中的Qualifier

偷懒到今天才开始学习(准确地说是昨天),刚把多维数组的指针搞明白一些,就遇到了新问题。
先来看看到目前为止我懂了些什么:

#include 
int main(void)
{
  int n = 1;
  int junk;
  int *p = &n;
  const int * cptr = &n; // cptr is supposed to protect the data it refers to,which,in this case,is the value of n.
  *cptr = 0; //When you try to change the value of 'n',the complier shall warn you.This statement is illegal.
  n = 0; //But you can still change the value of 'n',as long as you don't use 'cptr' to change its value.
  int * const pptr = &n; //The const qualifier can also be used to protect the value of a pointer.For example,we use const to protect the value of pptr.
  pptr = &junk; //Since the pptr is protected,this statement is illegal.
  return 0;
}

上文的程序是我到目前为止已经明白的东西,都已经用注释清楚地写在旁边了。
然而,当const涉及间接运算(非一层运算)时,我就,彻底,傻了!
考虑下面的代码:

const int ** pp1;
int * p1;
pp1 = &p1; //illegal.

为什么这样的操作是不允许的呢?
我们用之前对const的理解来试着解释这个问题,pp1是指向指针的指针,而const这一qualifier要求pp1指向的指针指向的数据是不能通过pp1来改变的。
而如果我们允许上述操作,下面的操作就成为可能:

int * p1;
const int ** pp1;
const int n = 10;
pp1 = &p1; //Assume that it's legal.
*pp1 = &n; // p1 now refers to const int n.
*p1 = 1; //Changed the value of const int n.

综上所述,这样子的间接运算容易导致const失去效果,导致bug的产生,所以是不允许的。

你可能感兴趣的:(初学C中的const时遇到的一些疑惑和解决)