1. 常量
值本身不会变,且不能改变,如身份证号。与之相反对应的是变量,即值可以改变,如年龄、身高。常量分为字面常量和#define定义的标识符常量,两者本质都一样。
1.1 字面常量
100 100.1 'a' "hello"
等都是字面常量,某个类型值的字面表示。
1.2 #define标识符常量
#define N 10
其实N就是10,当使用时它是符号替换的形式,N会替换成10。
2. 常变量
a就是常变量,假如有这么一个操作a = 20;
,这样直接修改其值是会报错的。不过却可以间接修改,使用指针访问它的内存就可以做到,原因是常变量本质还是变量。
#include <stdio.h>
int main()
{
const int a = 10;
int* pa = &a;
a = 20; // ERROR
*pa = 20; // OK
return 0;
}
3. 相同点与区别
-
常变量与常量的值都是固定的,不能直接改变,这点来说是一样的。
-
常变量只是语法层面的约束值不能改变,本质还是变量。就好比一个中国人,到了美国拿了绿卡,只是法律上的效果,其本质还是中国人。在vs中,
int arr[M]
这样初始化数组大小是不行的,因为M本质是变量而不是真正意义的常量。不过C99中支持变长数组,在GCC编译器下这样没问题,但只能初始化大小,不能初始化内容。