C语言中const语法规则和用法的解析

const 的用法的原理详细分析起来,一定要给出理由的话,还是比较困难的,但c编译器对const处理的语法规则还是有章可循的。

下面就具体分析一下const的语法规则:

 

const int a=2;  //const修饰了int ,表示这行代码定义的变量,最后的取的int型的值是常量2,不可被后面的代码修改。

int const a=2; //const修饰了变量a ,表示这行代码定义的变量,最后的取的int型的值是常量2,不可被后面的代码修改。

const int *a;  //const修饰了int ,表示这行代码定义的变量,最后的取的int型的值是常量,不可被后面的代码修改,

                    //但这行代码所定义的变量a是一个地址量因为没有被const修饰,还是可以被修改的。

int const *a; //const修饰了 *a , *a表示这行代码定义的变量a的取值, *a为int型值,即这行代码定义了a,最后的取的int型的值是常量,不可被后面的代码修改,

                   //但这行代码所定义的变量a是一个地址量因为没有被const修饰,还是可以被修改的。

int * const a; //const修饰了 a , a是一个地址变量,则a中存储的地址量将是一个常量,不能被后面的代码修改。这行代码中未被const修饰的是 *a 即对变量地址的取值,所以*a是可以被修改的。


const int **a; //const修饰了int ,表示这行代码定义的变量,最后的取的int型的值是常量,不可被后面的代码修改,

                     //但这行代码所定义的变量a是一个地址量因为没有被const修饰,还是可以被修改的。

                    //同理 这行代码中,*a也是一个地址变量,也没有被const修饰,也是可以被修改的。

 

int const**a; //const修饰了**a ,**a表示这行代码定义的变量a的最终值, **a为int型值,即这行代码定义了a,最后的取的int型的值是常量,不可被后面的代码修改,

                     //但这行代码所定义的变量a是一个地址量因为没有被const修饰,还是可以被修改的。

                    //同理 这行代码中,*a也是一个地址变量,也没有被const修饰,也是可以被修改的。

 

int *const*a; //const修饰了*a ,*a表示这行代码定义的地址变量a中一个地址值的取值(其实也是一个地址值), *a因此设定为地址常量,不可被后面的代码修改,

                     //但这行代码所定义的变量a是一个地址量因为没有被const修饰,还是可以被修改的。

                    //同理 这行代码中,**a也是一个int型量,也没有被const修饰,也是可以被修改的。

 

int ** const a; //const修饰了a ,a表示这行代码定义的地址变量a中一个地址值, a因此设定为地址常量,不可被后面的代码修改,

                     //但*a是一个地址量因为没有被const修饰,还是可以被修改的。

                    //同理 这行代码中,**a也是一个int型量,也没有被const修饰,也是可以被修改的。

 

const 所在的几个位置

例:
int  ***...* a;
[cst1]  int  [cst2]  *  [cst3]  *  [cst4]  *  ...  *  [cstx]  a;

[cst1] 与[cst2]效果等价,不能同时共存,其它const修饰位置可共存

 

修饰的变量定义的初始化或则赋值,需要相应修饰的低一级指针变量,例:

int x=3;
int const*wr=&x;
int const*const*vv=≀ //编译通过
int const*const**a=&vv; //编译通过
同理:

int const*const***as=&a; //编译通过


as变量中的两个const,分别是const 4ptr    ,const 3ptr,

a取地址赋值给as,a中 相应也有两个const ,分别是 const 3ptr ,const 2ptr..

 

另一个例子:

int x=3;

int const*wr=&x;

int const** const vv=≀ //编译通过
int const**const*a=&vv; //编译通过
同理:

int const**const**as=&a; //编译通过

 

 

 

 

 

 

   

 

 

posted @ 2012-10-06 23:37  cymheart  阅读(2265)  评论(0编辑  收藏  举报