常量指针和指向常量的指针[亲测有效]

常量指针和指向常量的指针[亲测有效]网上基本上是下面两种说法:常量指针(pointertoconst)和指针常量(constpointer)C++Primer中文版(第5版,王刚杨巨峰译)中是下面两种说法:指向常量的指针(pointertoconst)和常量指针(constpointer)注意:这两个版本中“常量指针”的定义是相反的。不如就用英文表示,理解起来更容易些。pointertocons…

大家好,欢迎来到IT知识分享网。

网上基本上是下面两种说法:
常量指针(pointer to const)和指针常量(const pointer)

C++ Primer中文版(第5版,王刚 杨巨峰 译)中是下面两种说法:
指向常量的指针(pointer to const)和常量指针(const pointer)

注意:这两个版本中“常量指针”的定义是相反的。

不如就用英文表示,理解起来更容易些。

pointer to const

这里的const为名词性质,to为指向性介词,to const为后置定语,表示“指向常量的”意思,更确切地说,pointer to const表示的是“无法通过该指针修改其指向的对象”,而它指向的对象不一定需要const修饰

//以下两种语句均可编译通过
//1.
int a=0x0f;
const int* p_a;
p_a=&a;
//2.
const int b=0xff;
const int* p_b=&b;

//以下语句(通过该指针修改指向对象的值)报错:表达式必须是可修改的左值
//*p_a=0x0d;
//*p_b=0x0d;

IT知识分享网

const pointer

这里的const为形容词性质,表示“指针本身为常量”,在声明时需完成初始化此后该指针不可更改(不可指向其他地址的意思)。

IT知识分享网//const pointer初始化
int c=0xef;
int* const p_c=&c;
//以下语句正确
*p_c=0x01;
//以下语句(指针重新赋值)报错:表达式必须是可修改的左值
//p_c=&a;

reference to const

类似的,还有对常量的引用(reference to const),表示“不能通过该引用修改它所绑定的对象”,同样,它绑定的对象不一定需要const修饰,与pointer to const有点像。

//以下两种语句均正确
//1.
const int d=0xcc;
const int& r_d=d;
//2.
int e=0xcd;
const int& r_e=e;
//通过该引用修改原对象时报错:表达式必须是可修改的左值
//r_d=0xff;

但是与pointer to const的用法还是有差异的:

IT知识分享网double f = 1.234;
//以下语句正确
const int& r_f = f;
//以下语句编译报错
//const int* p_f = &f;

实际上,const int& r_f = f相当于

const int tmp=f;
const int& r_f=tmp;

从汇编来看的话更明显一些了

	double f = 1.234;
00D51DEC  movsd       xmm0,mmword ptr [__real@3ff3be76c8b43958 (0D5CB78h)]  
00D51DF4  movsd       mmword ptr [f],xmm0  
	const int& r_f = f;
00D51DF9  cvttsd2si   eax,mmword ptr [f]  
00D51DFE  mov         dword ptr [ebp-58h],eax  
00D51E01  lea         ecx,[ebp-58h]  
00D51E04  mov         dword ptr [r_f],ecx  

其中,cvttsd2si指令对double进行了截断。

Emmm,先写这么多吧

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12093.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信