概述
C语言中的const关键字用于修饰变量、函数参数、函数返回值,以指明它们的值在程序的整个执行期间
都不会被改变。const限定的变量值是只读的,不能通过程序改变它的值。const是一个C语言(ANSI
C)的关键字,具有着举足轻重的地位。它限定一个变量不允许被改变,产生静态作用。
1 const修饰变量
变量名前加上const关键字,表明该变量是一个常量,它的值在程序运行期间不能被改变。const 修饰的
变量是一个常量,它的值在程序执行期间不会改变,只能被赋值一次。
const修饰后的变量i是只读的,不允许被修改,在编译的时候会报error。
2 const修饰函数参数
const 函数是一种特殊的函数,它可以保护函数的内容不被修改和更改。一旦函数被声明为const,它的
任何内容都不能被修改,任何试图修改它的尝试都会导致编译时错误。通常,const函数用于保护数据结
构,以防止意外的更改。
const修饰函数表示函数不可以修改,意味着函数内部的变量和参数也不可以被修改,而且函数内部不能
执行像write或者malloc之类的修改变量的操作。
2.1 const修饰函数参数
const修饰函数参数表示该参数是常量,在函数体内不允许改变参数的值。当函数被调用时,它只能被赋
予一个固定的值,这可以帮助编译器做出更好的优化,并保证不会发生意料之外的错误。
如果函数参数被const修饰,该参数是不能在函数里面被修改,否则是错误的。
2.2 const修饰函数返回值
const修饰的函数返回值表示返回的值是常量,不能对返回的值进行修改,也就是说在函数内部不能修改
返回值。
如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加 const 修饰
没有任何价值。
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,
该返回值只能被赋给加 const 修饰的同类型指针;
上面的写法是错误的,将出现编译错误如下:
正确的写法如下,要在变量前加个const才行。
3 const扩展
3.1 const变量与denfine常量
1、const 是在 编译、运行的时候起作用,而define 是在编译的预处理阶段起作用 。
2、const 有对应的数据类型,是要进行判断的,可以避免一些低级的错误。define 只是简单的字符串替
换,没有类型检查。而 const 有对应的数据类型
3、const 常量可以进行调试的,define 是不能进行调试的,因为在预编译阶段就已经替换掉了。
4、 const 定义的只读变量在程序运行过程中只有一份备份。define 只是进行展开,有多少地方使用,就
替换多少次,它定义的宏常量在内存中有若干个备份;
const int i = 3; int j[i]; 经过编译器是会报错,编译不过的。
原因分析:
常量是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”
则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。const就是用来限
定一个变量不允许被改变的修饰符。上述代码中变量i被修饰为只读变量,可惜再怎么修饰也不是常量。
而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的,“常量”不等于“不可变的
变量”。但是在C++中,局部数组是可以使用变量作为其长度的。
3.2 const修饰指针
const指针是指指向常量的指针,它指向的内存空间中的值不能更改,它只能指向一个常量,而不能指向任何变量或者表达式。
3.2.1 指针常量与常量指针
指针常量是指一个指针变量,它指向的位置是不能改变的,也就是说,它指向的内存位置是固定的。而常量指针则是指一个指针,它指向的内容是不可改变的,也就是说,它指向的内容是固定的。
指针常量:int *const p; const *int p;
常量指针:const int *p; int const *p;
指针常量是指指针本身的值不能被改变,但指针指向的数据却可以被改变。(地址是一定的,但内容可以修改)
常量指针则是指指针指向的数据不能被改变,但指针本身的值可以被改变。(指针可以指向其他地址,但内容不可以改变)