1.const 关键字
const 是 constant 的缩写,const 在实际编程中用得比较多,意思是“恒定不变的”,它是定义只读变量的关键字,或者说 const 是定义常变量的关键字。 (可读,不可写)
const 可以修饰变量,数组,指针等: 说 onst 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以叫常变量。用 const 定义常变量的方法很简单,就在通常定义变量时前面加 const 即可,如:
const int a=10;
const 和变量类型 int 可以互换位置,二者是等价的,即上条语句等价于
int const a = 10:
那么用 const 修饰后和未修饰前有什么区别呢? 用 const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。无论是全局常变量还是局部常变量都必须初始化赋值。
const在c语言中,最主要就是不修改值的函数,指针形参前加const
int main()
{
int a = 10;
int b = 20;
const int ca = 10;//不能改
int *p = &a;
p = &b;
//p = &ca;//error 假如合法 ,*p = 100;->ca=100
const int *p2 = &ca;//ok
//*p2 = 20;//error
//int *const p3 = &ca;//error
const int *p4 = &a;
int *const p5 = &a;
//p = p2;//error
return 0;
}
const 修饰变量和数组:
//const 规则1
int main()
{
int a = 10;//可读,可写
printf("%d\n",a);//读
a = 100;//写
const int ca = 10;//常变量,只读
printf("%d\n",ca);//读
a = ca;//ca读
//ca = 100;//error
int const cb = 10;//完全等同ca
//cb = 20;//error
return 0;
}
//const 规则2
int main()
{
int a = 10;
int b = 20;
int *p = &a;
p = &b;//p,写
*p = 100;//*p,写
const int *cp1 = &a;
//*cp1 = 100;//error
cp1 = &b;//ok
int const *cp2 = &a;//等同cp1(规则1)
//*cp2 = 100;//error
cp2 = &b;//ok
int *const cp3 = &a;
*cp3 = 100;//ok
//cp3 = &b;//error
const int *const cp4 = &a;//不使用
//*cp4 = 100//error
//cp4 = &b;//error
//a + b;
return 0;
}
const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
const 推出的初始目的,正是为了取代预编译指令,消除它的缺点,同时继承它的优点。
2.const与指针配合使用的作用:
const修饰指针变量的时候:
1、const如果在 * 的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本身的内容是可变的。
2、const如果放在 * 的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指向的内容,可以通过指针改变。
限制指针变量 ;限制指针变量指向的数据; 既要限制指针变量又限制指针变量指向的数据(双重限定)
2) 限制指针变量指向的数据
3)限制指针变量和指针变量指向的数据的值
3.const 与 define 的区别
从功能上说它们确实很像,但它们又有明显的不同:
1.#define 是预编译指令,而 const 是普通变量的定义,#define 定义的宏是在预处理阶段展开的,而 const 定义的只读变量是在编译运行阶段使用的。
2.const定义的是变量,而 define定义的是常量。define定义的宏在编译后就不存在了,它不占用内存,因为它不是变量系统只会给变量分配内存。但 const 定义的常变量本质上仍然是一个变量,具有变量的基本属性,有类型、占用存储单元。可以说,常变量是有名字的不变量,而常量是没有名字的。有名字就便于在程序中被引用,所以从使用的角度看,除了不能作为数组的长度,用 const 定义的常变量具有宏的优点,而且使用更方便,所以编程时在使用 const和 define都可以的情况下尽量使用常变量来取代宏。
3.const定义的是变量,而宏定义的是常量,所以const 定义的对象有数据类型,而宏定义的对象没有数据类型。所以编译器可以对前者进行类型安全检查,而对后者只是机械地进行字符替换,没有类型安全检查。这样就很容易出问题,即"边际问题”或者说是“括号问题"