在C语言中,const声明的变量是只读变量,并不等同于常量。
const和define的区别是什么?
1.对于define宏,在C语言中是单纯的替换。在预编译阶段就是完成全量替换操作,并不检查对错。
2.而const,程序在编译的时候会检查const的类型,如果不对的话,编译会报错。
3.const可以保护被修饰的东西,防止被意外或者恶意修改。例如函数中的传参数,如果用const修饰的话,在函数内部是不允许修改这个参数的数值的。
const int a;和int const a;效果是一样的,都是不允许在程序后续的执行过程中对变量a 的内容就行修改。所以说这个时候修饰的变量a应该尽量初始化,因为之后是不允许修改的。
int const *p;和int *const p;以及int const * const p;的区别?
1.const在*号的左边说明指针p存储的地址对应的内存空间里面的数值不能改变;
2.const在*号右边的话,说明p指针只能存储刚开始初始化的时候存储的地址,不能再次进行改变。
3.const在*的两侧都有的话就是上面两种情况同事发生。
例如:
int a=3;
int b=4;
int const *p1=&a;
这个时候p1存储的是变量a的地址,但是const是在*号左边的,(可以理解为,const修饰了p1的引用,即*p)那么*p1=4;(X)不对的。但是p1=&b;(正确)
int * const p2=&a;
这个时候p2存储的是变量a的地址,但是const实在*号右边的,(可以理解为,const修饰了指针变量p1)那么*p1=4;(正确)不对的。但是p1=&b;(不对)。这个时候p2只能存储初始化的时候赋值的a的地址。之后将不能改变。
int const a=6;
int arr[a];这个在C语言中是不正确的,因为ANSI C中规定,数组中括号中的必须是常量,而在C语言中const a;中的a是只读变量,并不是常量,所以是不对的,但是在C++中确实正确的。
是不是const定义的变量就真的不能改变了?
答案是否定的,例如:int const a =9;
尽管变量a的数值不能直接改变,但是我们可以定义一个指针存储a的地址,然后通过地址进行改变。
int *p=&a;
*p = 12;
这样a的数值就变成了12.
但是在C++中是不成立的。