常量指针和指针常量

网上很多帖子常说的 常量指针和指针常量,傻傻分不清。。。中文太难理解,而且网上有两种不同的说法。比如pointer to const (指向常量的指针) 到底是叫常量指针还是指针常量,关于const pointer 和 pointer to const 的用法都是对的,但是名称却是有不一致,这就导致产生了很多误解,为后面的理解涂添加不便。

于是翻看了英文的定义

pointer to const    ----> const int *p       a pointer, which points to a const

const pointer     ------->int * const p    a pointer, which is const

这个理解就很容易了,定义明确表示了const的修饰关键,即const 修饰指针就是const pointer,否则是pointer to const。不会像常量指针,指针常量这样迷惑人。故,以下讨论针对 const pointer 和 pointer to const 进行。

在谈及指针问题之前,先来说一下常量。所谓常量就是不可以改变的量,与变量相对。

来看一个示例:

#include <iostream>
using namespace std;

int main()
{
	int const t = 5;
	t = 9;
	return 0;
}

结果当然会报错,因为常量不可改变,换句话说就是read-only。看报错信息


当然,const int 和 int const 是一样的。

然后在来看第一个主角, pointer to const,数据类型以int 为例 const int *p(同 int const *p),

我们知道,*p 表示的是指针p 指向的地址空间的值,某种意义上课等同于上例中的常量t;那么既然 t 是read-only,那么是否*p也是一样?

#include <iostream>
using namespace std;

int main()
{
	const int t = 5;
	t = 9;

	int a = 1;
	int b = 2;
	int c = 4;

	const int *p = &a;
	*p = 4;
	return 0;
}
上述t为常量, p为常量指针,类比应该报错一样。结果如猜想一样,p也是read-only。

至此便得出了第一个结论:const int *p,*p不可改变,即不可像通常指针那样,通过指针来改变指向地址空间的值。当然这个地址空间本身的值是否改变,就无关这个指针什么事了。

当然常数指针还没完,*p 不可以改变,那么p是否可以改变呢?

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int b = 2;
	int c = 4;

	const int *p = &a;
	cout <<*p <<endl;
	p = &b;
	cout <<*p <<endl;
	return 0;
}
且看运行结果:


结果显示,没有错误,p成功改变指向。

至此得出第二个结论:const int * p,指针本身p 可以改变指向。


接下来看 const pointer, 以int 类型为例, 定义 int * const p

此处const直接修饰 指针p (个人趋向这个叫常量指针),即是说明p 的指向不可改变,看示例结果

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int b = 2;
	int c = 4;
	int * const p = &a;
	p = &a;
	return 0;
}
结果报错:


至此得出第三个结论:int * cosnt p, p本身为const, 不可改变指向。

那么是否可以通过指针改变所指地址空间的值呢?

#include <iostream>
using namespace std;

int main()
{
	int a = 1;
	int * const p = &a;
	*p = 10;
	cout <<*p <<endl;
	cout <<a <<endl;
	return 0;
}
结果如下:

结论四:int * const p, 可以通过指针来修改指向地址的值。


但其实关键的就在于一点,看const直接修饰谁,const 后面紧跟着的就不可以改变,即是read-only.


英文定义参考:http://blog.csdn.net/richardysteven/article/details/5981877

猜你喜欢

转载自blog.csdn.net/wx_14678/article/details/77675563