常量指针(const pointer)和指向常量的指针(pointer to const)的区别和解释

  大部分程序员都会被中文中这两种变态的叫法,搞的头疼。大部分人实际上一直分不清两者的用途和区别。我也曾经被绕的头晕脑胀,被面试官问的面红耳赤,不得不佩服中文语法的灵活。不过具体了解这两种类型,会对实际的编码工作非常有帮助,可以有助于我们更好的设计接口的返回值和入参。提高代码的性能。
 
一、常量指针和指针常量从命名上的区别
常量指针(两种写法):
const int * a;  //const读作常量,*读作指针,按照顺序读作常量指针
int const* a;   //const读作常量,*读作指针,按照顺序读作常量指针
 
指针常量:
int* const a; /*读作指针,/const读作常量,按照顺序读作指针常量
 
二、两者功能上的区别
常量指针(pointer to const)的含义和功能
    1. 指向常量的指针。指针本身允许修改,指针指向的对象不允许被修改。
    2.注意指针*和const的位置,const 用于修饰*右边的部分(*p),修饰的是 整个解引用(指向的对象)
 
指针常量(const pointer)的含义和功能
   1.指针常量,指针本身是常量,不允许修改,但是指针指向的对象允许修改。
   2.const 仅仅修饰p本身
 
技巧:判读const与*的位置,明确const修饰的范围。
 
 
三、指针常量和C++引用的关系:
 
C++常量在声明后,必须立刻进行初始化。在C++引用中也存在这样的情况,引用在创建后也必须用初始化。二者之间存在什么联系吗?让他们的初始化流程如此相似。
 
示例代码:
const int a = 10;
 
int b =10;
int& a = b;
 
在C++ Primer 中,引用一直被解释为变量的别名。那么别名又是什么?
 
实际上引用的本质就是指针常量。指针类型的常量。该常量是一个指针,初始化以后就和对象绑定了,该指针标识的地址不能被修改。和引用的作用一样。
 
通过寄存器,发现直接使用引用和常量指针的反汇编是一样的,都是:
 
int *const pi = &b;
00943C42  lea         eax,[b] 
00943C45  mov         dword ptr [pi],eax 
            *pi = 1; //通过pa指向的obj对象
00943C48  mov         eax,dword ptr [pi] 
00943C4B  mov         dword ptr [eax],1 
 
            int &mm = b;
00943C51  lea         eax,[b] 
00943C54  mov         dword ptr [mm],eax 

猜你喜欢

转载自www.cnblogs.com/ByzantineEmpire/p/9561857.html