c语言和c 中const的不同
首先我们需要区分一下c语言中的const和c 中的const,c语言中的const修饰的变量可以不初始化,但如果将一个变量定位为const类型还不初始化,那么之后就不能对这个变量直接赋值了。
如果我们使用c语言中的const定义的变量指定数组的大小,那么就会直接报错,因为数组大小的初始化必须是一个常量,实际上在c语言中,const确实不是用来定义一个常量的,而是用来定义一个常变量的,只是这个变量的值不能被直接修改(通过指针还是可以修改这块内存的值的),除此之外这个变量和其他的c语言的变量没什么区别,甚至连编译生成指令的方式都是一样的。
但是在c 中,const就是真正用来定义一个常量的,不进行初始化就会直接报错。
这主要是因为常量的编译方式和变量的编译方式不同,常量在编译阶段会将整个程序中这个常量的名称都替换为这个常量的值,那么如果你在定义一个常量的时候,还不进行初始化的话,编译器就不知道要替换为什么值,自然就会直接报错了。
用c 中的const修饰的变量可以初始化数组的大小,也说明了这个变量实际上是一个常量。
当然了既然已经用const修饰作为常量了,那么这个变量就不能作为左值来使用了,毕竟你不能修改一个常量的值嘛。
如果你按照下面这种方式在c 中定义一个const类型的变量,那么这个变量就直接退化为了c语言中的常变量了。
int a = 10; const int p = a; return 0;
c 中的const配合一级指针使用
一般来说,在c 中const配合一级指针使用有四种形式。
const int *p int const* p; int* const p; const int* const p;
const的修饰作用
那么很多人其实分不清这上面四种const用法所产生的效果,实际上,在c 中const修饰的是离它最近的类型。
比如const int *p,这个const显然修饰的是int类型,也就是*p,p本身是一个int*类型的,*p就是int类型嘛,代表*p不能被改变。
int const *p,这个const离int最近,所以也是修饰int类型,同样是*p,代表*p不能被改变,也就是指针所指向的值不能改变。
int *const p的const就是离int *最近了,所以修饰的是int*类型,也就是p,代表p所指向的地址不能改变。
const int * const p有两个const,离第一个const最近的是int,离第二个const最近的是int *,所以第一个const修饰的是*p,代表*p不能改变,第二个const修饰的是p,代表p不能改变,所以呢,这个指针所指向的值不能被修改,指向的地址也不能被修改。
const的类型转换
对于const的类型转换,我们需要知道一个原则,那就是const的右边如果没有指针符号的话,const不参与类型之中。
int* q; int* const p; const int* w;
int *q的类型是int *,int *const p的类型也是int *,因为const的右边没有*号,所以const不参与类型中,而const int *w的类型就是const int*了,因为const的右边存在*号。
另外呢,从int *是可以转换到const int *的,但是const int *不能转换为int *,否则不就代表你可以修改这个指针所指向的值了吗。