前些日子再看《c++与面向对象》那本书的时候,遇到了const这个限定符,书中举了许多“const”位置不同的例子看得我头晕,例如,int * const p 、 int const * p 、const int *p 。今天我誊出了一个下午的时间对指针与const限定符做了一个全面的总结。应该还会又不完善的地方,以后回继续补充修改。
当用const限定指针时,需要注意常用的以下五类:
一),指向非常量的非常量指针(不使用const)
例如,int val1,val2;
int *p;
val1 = 10;
val2 = 20;
p = &val1;
p = &val2;
*p += 10;
二),指向常量数据的非常量指针
const int * p
p是指向常整数的指针,即p指向的整数是不能通过p来修改的,即不能通过*p来修改该整数,但这并不意味着该整数是不可修改的,实际上可以通过其他途径来修改。
例如,int i,j;
const int *p; //p是一个指向常量数据的指针,是变量,所以修改p本身是允许的,但*p=5是错误的。
p = &j; //允许
p = &i; //允许
i = 10; //允许
*p = 5; //不允许
三),指向非常量数据的常量指针
int * const p;
如果想声明一个不可修改的指针变量,保证该指针总是指向固定的内存地址,则需要定义常量指针。
int var;
int * const p = &var;
//声明p的同时对p进行初始化,通过这个声明,p定义为一个指向整数的常量指针。这意味着p指向的整数通过p是可修改的,但是本身的值在初始化后,就不能杂修改了,也就是说,p只能永远指向变量var,另外,由于声明了p是指向整型变量的,也不能将const修饰的整型变量的地址赋给p
例如,const int var;
int * const p = &var; //错误 var是一个常量
四),指向常量数据的常量指针
用const同时限定指针和指针指向的数据
const int val = 10;
const int * const p = &val;
val是一个常整型变量,初始化后不可在修改;p是一个指向长整数的常量指针,p本身在初始化指向val后也不能被修改,同时也不能通过p修改它所指向的变量。
五),const用于传递函数参数
传值:不会破坏实参,但传递参数时要复制数据,如果参数存储空间较大在时间与空间上效率低。
传引用:传递的数据量小,在时间与空间上效率较高,但被调用函数可以操作实参,可能带来完全的隐患
阅读(809) | 评论(0) | 转发(0) |