常量指针和指针常量是两个常常出现的概念,今天作个小小总结。c++
文章各部分的内容都是很容易理解的,而且附加代码说明,一切的前提是理解文章2.1和2.2部分,因此搞好基础再日后看呐。干货在嫌长的直接跳到结论去。git
最近在看VC++,看到书里有提这两个概念,学C的时候也有这两个概念,学C++的时候也有顶层const和底层const(这个我懂是懂,但从理解层次上不是那么懂为何叫作顶层和底层)。因此就是这个知识点很常见啦,但彷佛不少人很迷惑,或者说理解着不舒服。因而个人“神逻辑”就来了。github
常量指针、指针常量这种名词是英文翻译过来的,因此中文会有点拗口。常量的、指针的,咱们生活中是没有这样的词的。函数
英文里是这样的两个东西:pointer to const, const pointer。翻译
pointer是指针
的意思;const是constant的缩写,做名词是常量
的意思,做形容词是不变的
的意思。指针
这两个词:pointer to const, const pointer。中文有两种翻译方法:code
翻译方法 | pointer to const | const pointer |
---|---|---|
第一种 | 指向常量的指针(常量指针) | 不变的指针(指针常量) |
第二种 | 指向常量的指针(指针常量) | 不变的指针(常量指针) |
说来讲去都是翻译的问题。英文里很容易能看懂的意思,换成中文就有两种换法。游戏
我同意第一种翻译方法,由于它更符合中文习惯。内存
第二种方法确实不应有指针常量这个说法,太不合中文习惯。get
因此要讨论中文版的话,若是出现指针常量,也应该是第一种方法。
下面是一篇讲常量指针和指针常量的文章:
https://www.thegeekstuff.com/2012/06/c-constant-pointers换成英文就不用玩文字游戏了
因此呢,本质上应该用英语去讲。但本篇是讲中文版的一种方法。(去百度也会发现有两种说法,缘由是翻译不一样)。
本文用第一种说法,常指是pointer to const,指常是 const pointer。
常指、指常就是两个词而已,都是四个字。把前边的两个字当作形容词(是用来修饰后边的名词的),后边的名词才是重点。
指针就是地址嘛,常量就是不能够修改的量(初始化不算作赋值,不算作修改)。
注意区分指针自己(的内容)和指向的内存的内容。
修改指针即改变指针自己的内容,修改内存或者说修改内存内容就是修改指针指向的内存中的内容。这样讲的很清楚了吧.....…..
常量指针中的常量呢,指的是这个指针的做用是常量性的、无权修改的,即不能够经过该指针修改内存中的内容,并不表明指向的内存不修改,注意前边有经过二字。
这个词也有指向常量的指针的叫法,我认为这个中文叫法是不许确的甚至是错误的。若是说常量指针是指向常量的指针,我认为这句话最直接的意思是说指针指向的内存是常量,这个意思是错误的,会误导他人,因此我不提倡这样叫它。证实参见文章3.3部分
在讨论问题的时候,互相知道对方说的是什么东西很是重要~,好比c++里的默认构造,没有构造函数这样的句子,不一样人的理解方式不一样,这些概念理解也是讨论进行的一个前提。
这里的指针呢,指的是这个常量是一个地址。
//代码1 const char * p; //常量指针 char const * p; //常量指针 跟上一句等效 char * const p; //指针常量
const 在*左边=》常量指针;反之,指针常量。
const近=》指针常量;反之,常量指针。(const就是不变嘛,*就是指针,因此理解是很重要的,也就是2.1)
//代码2 //char ch[] = "HelloWorld!"; const char* pStr1=ch; //定义常量指针 //1.常量指针自己的值能够修改 pStr1 = nullptr; //correct //2.不能经过常量指针修改它所指向的内存中的内容(注意经过二字,不要误会常量指针) *pStr1 = 'h'; //error *(pStr1 + 1) = 'E'; //error pStr1[2] = 'L'; //error
//代码3 //char ch[] = "HelloWorld!"; //指针常量(顶层const) char * const pStr2 = ch; //定义并初始化 //1.是常量,不能够被赋值(不把初始化叫作赋值) pStr2 = nullptr; //error
//代码4 int n = 0; //定义变量n const int * p1 = &n; //常量指针p1 int * const p2 = &n; //指针常量p2 *p1 = 3; //error 由于不能经过常量指针修改内存中的内容,划重点!:但这不是说指向内存中的内容不可修改 n = 3; //correct 这是对的,由于n是变量啊 *p2 = 3; //correct 指针常量部分的代码就有体现,很少说
//代码5 const int n = 0; //定义变量n const int * p1 = &n; //常量指针p1 int * const p2 = &n; //error 错误的 缘由见下-指针间的赋值 *p1 = 3; //error 缘由是常指不可修改内存 n = 3; //error 缘由是n是变量
代码4和代码5中的常量指针p1都不能改变内存中内容,但内存中内容是否可修改是不必定的。(代码4的第5第6行要好好看)
缘由是:常量指针不能够修改内存是由于不能够经过常量指针修改内存所致(你不经过常量指针的话,变量是否能够修改就不必定了)
在这里指pointer to const。指针做用是常量性的,不能够经过它修改指向内存(容易被误会成内存必定不可修改)。
英文里指const pointer。指针是一个常量,指针自己不能够被修改。
做者:@臭咸鱼
本文为做者原创,转载请注明出处:https://chouxianyu.github.io/2018/08/26/常量指针与指针常量/#more
欢迎转发和评论