指针常量和常量指针的区别,看看你们的理解跟我的一样嘛??

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28584889/article/details/88530340

以前学C++的时候关于这两者的区别还做过笔记,现在翻出来发现跟现在理解的正好相反!!也不知道以前是不是看了CSDN就轻率做了自己的总结。今天看了CSDN上面很多的总结发现各种混乱的解释,又查阅了C++primer(中文版)这本书(别的书没有哈哈),把我现在这个问题的总结写一下。

仔细研究了指针常量和常量指针的区别,感觉CSDN上分四种解释:前两种是指针常量和常量指针刚好解释的是相反的(名称和定义方式+区别刚好相反),第三种是指向常量的指针和指针常量这样的解释;第四种是指向常量的指针和常量指针这种跟第三种有一半不一样的解释。

 总之一句话:关于这个问题的总结和讨论已经是百家争鸣了。感觉可能不同版本的中文翻译不一样,日积月累就形成了现在大家这种乱七八糟的认识(有些是错误的)!!直到我看到有人说根据英文名称去理解

const pointer  翻译成常量指针无可厚非吧,其定义方式为:int * const p = &a; 把*放在const之前用以表示指针本身是一个常量,必须进行初始化(C++primer是这样解释的);

另外的pointer to const 翻译成指向常量的指针,这个按照翻译就更好理解了,本身就是一个指针,他指向一个常量,问题是很多地方会把这个概念简称为指针常量,按说简称也没啥问题,只要你把定义方式和区别理清就好啦,还偏偏有些就把这两者的名称跟定义方式+区别完全搞反了(以前我就是这样总结的,刚好跟现在相反,网上查了之后,发现这种相反理解的不在少数!所以我觉得这个问题很大,有必要搞清楚一点)。

非常说明:我说的错误理解是长得像下面这样的!!(注意这是错误理解示范!!!):

我现在认为的正确理解是:

pointer to const(指向常量的指针),简称为“指针常量”。意思是不能改变指向某变量的值,但可以改变指向别的变量(即指针保存的内容可被修改)。可以不必初始化。

定义方式:

const int *p1; //推荐这种

int const *p1; //两者等价。

const pointer (常量指针,简称常指针),不能改变指向的变量(即不能改变指针保存的内容),但可以改变已经指向某变量的内容(即变量的值)。

定义方式:

int *const p2=&a; //必须初始化,指向一个变量,不能改变其指向。

巧记方式

巧计方式就是倒着读定义(C++primer推荐的)。比如

char * const  s;

可以读作 s is a const pointer to char,也就是s是一个常量指针指向一个char类型。此时s指向固定,但是指向地址的内容可变。 

const char * s;

s is a pointer to char const,即s是一个指针指向一个常量char类型。 
此时s指向可以可变,指向地址的内容不能变。

char const *s;

s is a pointer to const char,即s是一个指针指向常量char类型数据。 
所以类型同上。


最后还有一个容易错的

指向常量的常量指针,简称为指向常量的常指针有些地方错误解释为指向常量的指针常量,这种明显是上面两种概念刚好弄混的)。

指向常量的常指针,其实就是把指向常量的指针和常量指针柔和在一起,那么他们的性质也糅合在一起啦,所以它特有的性质就是:它既不能再指向别的常量,指向的值内容也不能修改。(就是说,*p和p均为只读,都不可以修改。)

#include<iostream>
using namespace std;
int main(){
	const int * const p = new int;
	p++;
	*p = 23;
	return 0;
}
/* 第5-6行均报错,提示:表达式必须是可修改的左值

猜你喜欢

转载自blog.csdn.net/qq_28584889/article/details/88530340