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; //编译通过