const修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。
const关键字的作用主要有以下几点:
①可以定义const变量,具有不可变性。如:
const int Max = 100;
int Array[Max];
②便于进行类型检查,使编译器对处理内容有更多了解,消除了一些隐患。如:
void fun(const int i)
{......}
编译器就会知道i是一个常量,不允许修改;
③可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改;
④可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。还是上面的例子,如果在函数体内修改了i,编译器就会报错;如:
void fun(const int i)
{
i = 10;//error!
}
⑤为函数重载提供了一个参考
class A
{
void fun(int i){......}//一个函数
void fun(int i) const {......}//一个函数的重载
};
⑥可以节省空间,避免不必要的内存分配。如:
#define PI 3.14159//常量宏
const double pi = 3.1415926;//此时并未将pi放入ROM中
double i = pi;//此时为pi分配内存,以后不再分配
double I = PI;//编译期间进行宏替换,分配内存
double j = pi;//没有内存分配
double J = PI;//再进行宏替换,又一次分配内存
const定义变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。
⑦提高了效率;编译器通常不为const常量分配内存空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
⑧const修饰普通变量
const int a = 3;
a = 5;//不能改值
组合方式:
const int a;
int const a;
int a const;//错误
总结:不管const放在数据类型的前还是后,这个变量都是只读变量。
⑨const修饰指针变量
当const修饰指针时,由于const的位置不同,它的修饰对象会有所不同。
如下面的代码,int *const p中const修饰p的值,所以理解为p的值不可以改变,即p只能指向固定的一个变量地址,但可以通过*p读写这个变量的值。
int a = 0;
int b = 10;
int *const p = &a;//p指向了a的地址,p只能指向a 的地址
//p = &b;//错误
//p是一个常量指针,p只能指定固定的一个变量地址,但可以通过*p读写这个变量的值
*p = 7;
printf("a = %d\n",a);
再如下代码,int const *p1或者const int *p1两种情况中const修饰*p1,所以理解为*p1的值不可以改变,即不可以给*p1赋值改变p1指向变量的值,但可以通过给p赋值不同的地址改变这个指针指向。
int a = 0;
int b = 9;
const int *p1 = &a; 或int const *p1 = &a; //p1可以指向一个int类型的地址,但不可以用*p的方式修改这个内存的值
//*p1 = 10;//错误
printf("%d\n",*p);
p1 = &b;
printf("%d\n",*p);
总结:1.指针变量(p)为只读,指针变量名与const之间没有任何修饰符。
2.指针指向的值(*p1)为只读,const修饰(int*)或者修饰(*)。
除了以上三种组合方式,还有:
const int const *p;
int const *const p;
const int * const p;
const int const * const p;
根据前面的总结1和2,可以轻易知道各种组合类型的意义。
阅读(1073) | 评论(0) | 转发(0) |