1、c标准
1、首先我们来了解一下现在所学的C标准,分别是C89、C99和C++99,C89标准的C语言中的const和C++中的const是有区别的,而在C99标准的C语言中是相同的。我们目前所学的C语言标准为C89标准。
2、在C语言(C89)中的const可以不初始化但后续也就无法对其赋值,所以尽管不初始化不会出错。但要使用const修饰的量就需要对其进行初始化。
2、const的用法
const:为constant的缩写,它修饰的量为一个常量即不能被修改的量。
修饰变量
修饰指针
3、修饰变量
修饰变量指的是,用const定义的变量不能随意改变,所以称它为只读变量
举个例子:
int main() { const int n = 10; n = 20; printf("%d\n",n); return 0; }
运行结果可见↓
可见const修饰的变量不能随意改变!
4、修饰指针
🍅const* p
既然const修饰的变量不能随意改变,我们是不是可以通过修改n的地址:int * p=&n,*p=20
int main() { const int n = 10; int* p = &n; *p = 20; printf("%d\n",n); return 0; }
const修饰的n不能改,结果把&n的值修改了!
这种方式是不是在间接破坏const呢?打个比方
我不允许你从大门进来,结果你把窗户打碎了进来
我们不允许这种无赖的行为发生,所以我们对*p进行修改:const int * p = &n;
int main() { const int n = 10; const int* p = &n; *p = 20; printf("%d\n",n); return 0; }
这时候说明const可以修饰指针
所以当const放在*的左边的时候(const int* p) == (const * int p)
修饰的是*p;修饰的是指针所指向的对象不能再被改变了;但p变量中的地址是可以改变的。
🍅*const p
那换个方式思考,我们把const放在*的右边呢?
int main() { const int n = 10; const int* const p = &n; *p = 20; p = 20; printf("%d\n",n); return 0; }
所以当const放在*的右边的时候(int * const p)
修饰的是p;表示p的内容不能被改变,但是p指向的对象是可以通过p来改变的。
5、趣味小故事
举一个恋爱花钱小故事来深入理解一下吧
int *p = &M,说明女孩p和李泽言M谈恋爱了;
谈恋爱以后,女孩就对男孩说:”你请我吃麦旋风吧“
因为一杯麦旋风要10元钱,意味着:*p = 0;就相当于把男孩的10元钱花掉了;
此时这个男孩比较抠门,不愿意把十块钱花掉;
男孩就很聪明,在*号的左边加了一个const:
女孩发现男孩M连一个把麦旋风都不请他吃,毅然决然的分手,于是通过*p=&n换了一个有一百块钱的男朋友n(白起)
此时男孩M慌了,心想:”既然你要换男朋友,那么我们再约定一下!“
男孩M对女孩说:”我可以请你吃,不过你不能换男朋友!”
男孩M于是把const移到了*号的右边;
此时p = 0可以执行,但是p = &m不能执行;
但是如果你遇到了一个男朋友:const int const p = &n;那么你可以分手了
说明这个男孩既不请吃东西,又不让你换男朋友!渣男!!
6、总结
const int* p:const放在了*的左边,修饰的是*p,使得*p不能通过p来改变,但是p可以被改变;
int* const p:const放在了*的右边,修饰的是p,p不能被改变,但是*p可以被改变;
const int* const p 既不能改变p,也不能改变*p。渣男!!