一.常量和变量的介绍
首先,常量和变量均是用来存储数据的。
1.常量:在程序执行的过程中它的值是不可以改变的
如:圆周率 性别 血型等。
常量分为**(1)字面常量****(2)const修饰的常变量**(3)#define定义的标识符常量 (4)枚举常量**
补充:对于#define定义的标识符常量,没有分号结束标记
字面常量:
如20 3.14
const修饰的常变量:(本质上还是一个变量,而不是常量)
当n没有被const修饰
例:
int num=10;
printf("%d\n",num);
num=20;//修改
printf("%d\n",num);
return 0;
结果是
10
20
但是,当const修饰num后
这里要注意,用const修饰变量的时候,一定要给变量初始化,否则之后就不能再进行赋值了。
const int num=10;//也可以写成 int const num=10;
printf("%d\n",num);
num=20;//修改
printf("%d\n",num);
return 0;
结果会报错
因为const修饰后,不可以再更改数值
那么,const修饰的变量最终变为了常量,还是任然是变量呢?
如下的一个例子:证明它还是一个变量
例:
int n=10;
int arr[n]={
0};
return 0;
结果会报错“应输入常量表达式”
[]中需要的是一个常量,而n是一个变量
const int n=10;
int arr[n]={
0};
return 0;
结果会报错
说明const修饰后的n本质上仍然是变量
补充一个用const修饰常量静态字符串:
const char* str="abcdef";
如果没有const修饰,当我们在之后的代码不小心写出str[2]='g';
这样的语句时,这个语句会导致对只读内存区域的赋值,然后程序会立刻异常终止。当加了const之后,这个错误在程序编译的时候就被检查出来,这就是const的好处,让逻辑错误在程序编译期就被发现。
const修饰全局变量
全局变量的作用域是整个文件,应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,会影响到其他引用这个全局变量的函数
,导致bug很难发现。如果一定要使用全局变量,应尽量使用const修饰全局变量,防止不必要的人为修改
。
常量指针和指针常量
常量指针:是指针指向的内容是常量
注意:
(1)常量指针指的是不能通过这个指针
改变变量的值,但是可以通过其他的引用
来改变变量的值
例:
int a=5;
const int * n=&a;
a=6;
//结果是6
(2)常量指针指向的值不能改变,并不意味着指针本身不能改变
,这个常量指针仍可以指向其他地址