what's the different between const pointer and pointer to const?

在C++ primer中,第二章第四节的const限定符,对这两个内容是这样定义的:

1、pointer to const 指向常量的指针(所以为什么我们要翻译成指针常量???中文翻译背锅)

与引用一样,也可以令指针指向常量和非常量。类似于常量的引用,指向常量的指针(pointer to const)不能用于改变其所指对象的值!要想存放常量对象的地址,就必须使用指向常量的指针。

eg:

const double pi = 3.14;  //pi是一个常量,它的值不能被改变

double *ptr = π    //错误,ptr是一个普通指针,而不是指向常量的指针

const double *cptr = π  //正确,cptr可以指向一个双精度的常量

*cptr = 42;      //错误,不能给*cptr赋值,指向常量的指针不允许做值修改

 

通俗来讲就是:指向常量的指针要求不能通过该指针改变对象的值!可以这样理解,指向常量的指针,指针就会觉得自己指向了常量,就自觉的不去改变所指对象的值。

 

2、const pointer 常量指针

常量指针,指的是指针本身是一个常量(const pointer最直白的翻译),常量指针(const pointer)必须初始化,而且一旦初始化完成,那么指针的值(存放在指针中的那个地址,指针指向的地址)就不能再改变了。所以相对于指向常量的指针来说,常量指针所指向的地址不会改变,至于地址里的值变不变无所谓,我只保证地址不变。

更加通俗的说法就是:常量指针像门牌号,我指向镇魂街11号,我只保证我指向镇魂街11号,至于11号里面住的是曹彦兵还是曹玄亮还是夏玲我都不关心。而指向常量的指针则是,我指向镇魂街13号,里面住的是亡灵,我指向镇魂街14号,里面住的也是亡灵(要不要保证同一个???),那我就不管了,我只要保证都是亡灵,至于地址是哪一个我不关心。

 

总结起来一句话就是:指向常量的指针地址可变,对象不可变;指针常量地址不可变,对象可变。

所以要弄懂它究竟是指向常量的指针还是指针常量我们只需要从右往左读该表达式即可。

遇到指针读指针,遇到*读point to,遇到const读const。

eg:

const char *p  p is a pointer to const char  p是一个指针,指向char型常量。这就是指向常量的指针!(再次吐槽,为什么要翻译成常量指针???)

char const *p   没有这种写法,其实相当于const char *p

char *const p  p is a const pointer to char  p是一个常量指针,指向char型数据。这就是常量指针!必须初始化,初始化过后,指针指向的地址就不能再改变了!

 

posted @ 2021-06-22 15:22  丶原来是枝知啊i  阅读(108)  评论(0)    收藏  举报