常量指针与指针常量

常量指针和指针常量是两个常常出现的概念,今天作个小小总结。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近=》指针常量;反之,常量指针。(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

欢迎转发和评论

相关文章
相关标签/搜索