const
用来修饰只读变量,只可以进行读取并不能进行修改对应的值
注:在C89/C90中const
修饰的变量不能用来做数组的下标,变量同样也不可以,数组在C89/C90的下标只能为常数,但是有的书把const
修饰的变量读作字符常量,这样在跨平台就很容易引起不必要的麻烦。
在C语言中,把检查严格的数据赋值给检查不太严格的数据类型的时候,不会有任何警告和报错,但是当把检查不太严格的变量赋给检查严格的变量就会产生警告,当然有的编译器不会,vs2013会但是vs2020就不会在进行报出警告了,但是仍然需要注意这一点,这是一个良好的规范。
const和 int都为关键字而关键字是不会用来修饰关键字的,而这个const是来修饰*
号的,表示无法通过该指针改变其指向的内容,但是该指针的指向确不受任何影响
注:下面两种情况的作用是相等的都是只可以改变该指针的指向,而不能通过该指针改变该指针的内容,但是能通过其他方式进行改变
const int *p = &a ;//一般使用这一个
int const *p = &a;
const
修饰的变量是真的无法修改吗,一点修改的途径都没有吗?
答案是否定的。
const
修饰的变量只是无法通过该变量直接进行修改,但是还是能间接修改的(指针),不过最好还是不要修改const修饰的变量,因为我们已经把他定义为const
了就已经明白了这个变量是只读的了,当然只是建议而已,这也是一个良好的习惯,const
也是便于他人在阅读我们的代码的时候进行了解到这个变量是只读的变量不要对其进行修改。俗话说,我们可以不用,但是不能不会,难免我们在阅读他人代码的时候,别人可能对const
修饰的变量进行了修改,我们确以为他没有改,不利于我们的理解,下面给出通过其他方法修改他的途径:
但是如果通过a变量进行更改会报错。
const 主要有以下两个作用:
一、用来修饰指针
主要有一下四(也可以说成 三)种方式:
const int *p = &a; //无法通过指针p来修改p指向的内容
int const *p = &a; //和第一个一样 无法通过指针p来修改p指向的内容
int* const p = &a; //无法修改p指针的指向 但是可以修改指针p
const int const *p = &a;//无法修改p指针的指向和无法通过p指针改变盘指针指向的内容
注释可能看着有点乱下面给一个表格
形式 | 能否修改p指针的指向 | 能否通过p指针来修改p指针指向的内容 |
---|---|---|
const int *p = &a; | √ | × |
int const *p=&a | √ | × |
int* const p = &a; | × | √ |
const int const *p = &a | × | √ |
二、用来做函数的返回值的类型
做函数的返回值一般也是用来指针进行返回指针的时候,且返回的变量我们不希望去修改他,我们就可以用const
进行修饰
const int* Myfunction()
{
rerurn &a; //这个变量一定要为全局变量或者在堆区开辟的空间,
// 否则会发生栈帧结束该变量生命周期到此结束被覆盖
// 而得到与我们想要得到的答案相差很多的结果
} ``