指针常量和指向常量的指针

原创 2016年08月29日 11:27:17

首先,我们从const 说起。

const 有两种写法格式:const int n=20 和 int const n=20,它们相同吗?毫无疑问它们是相同的,这点务必记住。总之记住const 和 int 哪个放前面哪个放后面没关系,都是一样的。有了这个概念后,我们再来看const int *p 和int const *p,按照你的理解它们相同吗?其实它们也是相同的,还是那句话int 和const的前后位置不影响语义。好了,到现在我们明白了这一对的关系,那么int * const p 和它们相同吗?下面我们具体分析它们的语义。

一、const int *p的语义(当然int const *p也是一样的)

下面先看一个例子:

//********代码开始*******
int a=30;
int b=40;
const int *p=&a;
p=&b;			//1、注意,p可以重新赋值一个新内存地址
b=80;			//2、想想看,这里能用*p=80;来代替吗?当然不能
printf("%d",*pi);//3、输出是80
//********代码结束*******

语义分析:从这个例子中不难看出,p的值可以被修改,即它可以重新指向另一内存地址。但是不能通过*p来修改b的值。为什么呢?

先,const修饰的是整个*p(注意我写的是*p不是p),所以*p是常量,是不能被赋值的(尽管p所指的b是变量,不是常量)。

其次,pi前没有被const修饰,所以p是指针变量,即能被赋值重新指向另一内存地址。

二、int *const p

下面还是先看一个例子:

//********代码开始*******
int a=30;
int b=40;
int *const p=&a;
//p=&b;				4、注意,p不能再这样重新赋值了,即不能再指向另一个新地址。
a=80;				//5、想想看,这里能用*p=80;来代替吗?可以,这里可以通过*p修改a的值
printf("%d",*pi);	//6、输出是80
//********代码结束*******
语义分析:从这段代码有没有发现,pi的值不能重新赋值修改了。它只能永远指向初始化时的内存地址。相反,这次你可以通过*p来修改a的值了。看下面的分析:

首先,p因为有了const的修饰,所以只是一个指针常量。也就是p不能修改了,即p不能重新赋值指向b了(如第4行)

其次,整个*p的前面没有const的修饰,也就是说*p是变量而非常量。所以我们可以通过*p来修改它指向内存a的值(如第5行的注释)

所以我们可以发现,p是指向int变量类型数据的指针常量。

最后总结两句:

1)如果const放在*p前,则不能修改的是*p(即不能这样 *p=80)而不是指p;

2)如果const放在p前,则p不能修改(即不能p=&b)

三、补充三种情况

情况一:int *p指向const int i常量的情况

//********代码开始*******
const int i=30;
int *p;
p=&i;	//可行吗?不行,const int类型的i的地址是不能赋值给
		//指向int类型地址的指针的,否则p岂不是可以修改i的值了吗
//********代码结束*******

我自己试了,虽然有警告,但是可行,而且可以利用p来修改i的值。如*p=100。(当然直接修改i的值肯定不行)所以为了避免我们可以把指针定义为const int *p

情况二:const int *p指向const int i常量的情况

//********代码开始*******
const int i=30;
const int *p;
p=&i;	//两个类型相同,可以这样赋值。
		//很显然,i的值无论是通过p还是i都是不能修改的
//********代码结束*******
情况三:用const int *const p申明的指针

//********代码开始*******
int i=30;
const int *const p;
p=&i;	//你能想象p能够做什么操作吗?p值不能改,
		//也不能通过p的值修改i的值。因为不管是*p还是p都是const的
//********代码结束*******





版权声明:本文为博主原创文章,未经博主允许不得转载。

指向常量的指针与常量指针的异同

当我们在模块化程序设计时,有一些数据希望共享,而又不希望其他程序修改它,也就是”只读“,我们常用const来修饰它。        指向const常量的指针:一个指针,如果通过它实施的间接引用操作只...

c++ - 常量指针与指向常量的指针

这是两个初学者容易混淆的概念。比如,T *pt = new T;const T *pct  = pt;//指向常量(const T)的指针T * const cpt = pt;//常量指针,指向T...
  • fishhg
  • fishhg
  • 2011年04月20日 00:17
  • 272

指向常量的指针和指针常量

指向常量的指针和指针常量 1)、const 常量的情况: Const int a=1; Int const b =c;//c 是已经声明过的类型 两者都可以,本地的const常量必须在第一...
  • TwigLiu
  • TwigLiu
  • 2013年05月10日 23:17
  • 432

指向常量的指针和指针常量

转自:http://blog.sina.com.cn/s/blog_62fd444301013jbz.html 1. 指向常量的指针 char ch[5] = “lisi”; 我们先定义...

C++ 常量指针 指向常量的指针

常量指针: 我们可以将指针声明为常量指针,这样指针是不可以改变的,但是指针指向的内容是可以改变。(指针中保存的地址是不可变的)。 #include using namespace st...

const int *p和int * const p的区别(常量指针与指向常量的指针)

对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &char_A;//指向常量的指针 char * const myPtr = &char_A;//常量的指针...

常量指针与指向常量的指针

在日常交流中,当一个 C++ 程序员说“常量指针(const pointer)”时,其实他表达的意思往往是“指向常量的指针(pointer to const)”。真不幸,这是两个完全不同的概念。 T ...

C++ 学习( 第一天)指针常量和指向常量的指针

const 指针有两种格式,一种是指针常量,表示指针本身是常量,指针值不可修改,指向的内容可以修改。   另一种是指向常量的指针,表示指向的对象是常量,指针值可以修改,但是指针的内容不可以修改。 ...

常量指针和指向常量的指针

经常C++程序员会提到“常量指针( const pointer )”, 其实他们想表达的意思往往是“指向常量的指针(pointer to const)”。 真不幸, 这是两个完全不同的概念。T* pt...
  • techx
  • techx
  • 2015年02月15日 14:17
  • 617

常量指针与指向常量的指针

const int *p和int * const p的区别 对于指针和常量,有以下三种形式都是正确的: const char * myPtr = &char_A;//指向常量的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:指针常量和指向常量的指针
举报原因:
原因补充:

(最多只允许输入30个字)