您的位置:首页 > 编程语言 > C语言/C++

浅析C++之指针和const限定符号

2017-03-22 17:27 363 查看
1、指向const对象的指针

如果指针指向const对象,则不允许用指针来改变其所指的const值:

const double *cptr ;
*cptr = 42; //❌,不能用该指针修改其所指值
也不能把一个const对象的地址赋给一个普通的、非const对象的指针,会编译错误:

const double pi = 3.14;
double *ptr = &pi //❌
const double *cptr = &pi //可以
允许把非const对象的指针赋给const对象的指针:

const double *pi;
double pval = 3.14;
pi = &pval; //可以,但是不能通过pi修改oval的值

⚠️:不能通过指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其它方法修改其所指的对象:

double pval = 3.1415;
const double *pi = &pval;
*pi = 3.14; //❌
double *copy = &pval;
*copy = 3.14; //✅
cout  << *pi << endl; //3.14
总结:

如果指向const的指针所指的对象并非const类型,则可以直接给该对象赋值,或者间接利用其他非const指针来修改其值。要记住,不能保证指向const的指针所指对象的值一定不可修改。

可以把指向const对象的指针理解为“自以为指向const的指针”。

2、const指针

int num = 0;
int *const p = #

上述定义可以读作“指针p是指向int型对象的const指针”。

与任何const常量相同,const指针也必须在定义时初始化。然后const指针不能再指向其它对象。
但const指针所指对象的值能否修改完全取决于该对象的类型。

问题:引用可以用常指针实现吗?

引用和常指针共同点:定义时都必须初始化,初始化之后都不能再指向其它的对象。

但是常指针可以初始化为NULL,而引用不行,引用总是指向某个对象。其它的引用和常指针差不多。

3、指针和typedef

给出以下语句:

typedef string *pstring;
const pstring p;
请问:p是什么类型的指针?

声明const pstring时const修饰的是pstring的指针,因此该句声明应该是把p定义为指向string类型对象的const指针。等价于:

string *const p;

这里之所以容易产生歧义,是因为const限定符既可以放在类型前也可以放在类型后,例如:

string const s1;
const string s2;
用typedef写const定义时,const限定符加在类型前容易引起对所定义的真正类型的误解:

string s;
typedef string * pstring;
const pstring p1 = &s;
pstring const p2 = &s;
string *const p3 = &s;
上面的三个p1,p2 ,p3是等价的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针 对象 const