const基本介绍
常数是常数的简称,用于定义常数。 这将限制一个变量不变,从而产生静态作用。 const最初发售的目的是取长补短,以代替预编译指令。
与define的对比
define是预编译指令,定义的宏在预处理阶段展开。 另一方面,const是普通变量的定义,是只读变量,在编译执行阶段使用。 define定义常数。 由define定义的宏在编译后消失,不消耗内存。 另一方面,const定义的常变量本质上是变量,具有变量的基本属性,有类型,消耗存储器单元。 除了不能用作数组的长度之外,常量定义的常变量具有宏的优点,而且易于使用。 由define定义的对象没有数据类型,编译器只能机械地替换字符。 如果没有类型的安全性检查,则会发生“极限问题”或“括号问题”。 const定义变量,有数据类型。 让我从几个方面说明一下const的使用方法。
修饰局部变量
一致性指数=5;
intconstnum=5;
两种写法都相同,表示变量num的值无法变更。 用const修饰变量时,请务必初始化。 不那样的话,之后就无法进入。 特殊情况将在后面叙述。
接下来,让我们看一下const用于修饰常量静态字符串的示例。
常数符号*符号=’ tech dreamer ‘;
如果没有const修饰,以后可能会无意中修改代码,如str [4]=’d’。 由此,发生向只读存储器区域的代入,程序异常结束。
如果添加const修饰,则在编译程序时会立即检测到该错误,在编译时会发现逻辑错误,从而可以防止后续的调试继续进行。
修饰全局变量
全局变量的范围是整个文件,全局变量的生存期是程序执行的整个过程,因此应该尽量避免使用全局变量。 一种隐藏的操作,其中一个函数更改全局变量的值会影响引用该变量的其他函数。
如果一定要使用全局变量,则应该尽量使用常量进行修饰,以免不必要的人进行修改。 用const修饰的局部变量具有静态特性,其生存周期也是程序执行的全过程,并不是因为具有静态特性就变成了静态变量。
修饰常量指针与指针常量
常量指针
常数指针的指针指向的内容为常数,有以下两种定义方法。
常数*编号;
int一致*编号;
需要注意以下两点。
常量指针是指,该指针不能改变变量值,但可以在其他引用中改变变量值。 intcnt=5;
常数*编号=CNT;
cnt=6;
虽然常数指针指向的值不能更改,但这并不意味着指针本身不能更改,常数指针可以指向其他地址。 intcnt=5;
inttmp=6;
常数*编号=CNT;
数字=位图;
指针常量
指针常数是指针本身为常数,不能指其他地址。 写法如下。
int *一致编号;
另外,指针常数指向的地址无法变更,但地址中保存的数值可以变更。 可以用指向要更改地址的指针的其他指针进行更改。
intcnt=5;
int*tmp=cnt;
int *常数=CNT;
*tmp=6;
区别常数指针和指针常数的关键是星号的位置,以星号为分界线。
如果const在星号的左侧,常数指针const在星号的右侧,则可以将指针常数星号读作“指针”,将const读作“常数”,这样内容就会完全一致。
int一致*编号; 常数指针,整数*常数; 是指针常数。
指向常量的常指针
也有指向常数的常规指针。 这相当于常数指针和指针常数的组合,指针指向的位置
不能改变并且也不能通过这个指针改变变量的值,例如
const int* const num;
这个代表num所指向的对象的值以及它的地址本身都不能被改变
修饰函数的形参
根据常量指针与指针常量,const修饰函数的参数也是分为三种情况
防止修改指针指向的内容void FUN(char *destin, const char *source);
其中 source 是输入参数,destin 是输出参数。给 source 加上 const 修饰后,如果函数体内的语句试图改动 source 的内容,编译器将报错,但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。
防止修改指针指向的地址void FUN ( int * const p1 , int * const p2 )
指针p1和指针p2指向的地址都不能修改。
以上两种的结合。
在C语言标准库中,有很多函数的形参都被 const 限制了,下面是部分函数的原型:
size_t strlen ( const char * str );
int strcmp ( const char * str1, const char * str2 );
char * strcat ( char * destination, const char * source );
char * strcpy ( char * destination, const char * source );
int system (const char* command);
int puts ( const char * str );
int printf ( const char * format, … );
修饰函数的返回值
如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针,例如
const char * FUN(void);
如下语句将出现编译错误:
char *str = FUN();
正确的用法是
const char *str = FUN();
思考
C与C++中的const用法有什么区别?编译器会给const定义的变量分配存储空间吗?const变量能被其他文件extern引用吗?