C/C++中指针常量和常量指针用法及区别

C/C++中指针常量和常量指针用法及区别


前言

指针是一种特殊的变量,指针的值为内存地址。


一、基本概念

1、指针常量:指针常量就是指针本身是常量,换句话说,就是指针的值(内存地址)是常量,不能改变。但是,内存地址所对应的内容是可以通过指针改变的。
2、常量指针:指向常量的指针,换句话说,就是指针指向的是常量,它指向的内容不能发生改变(注意:不能通过指针来修改它指向的内容,而可以通过原来的声明修改)。但是,指针自身不是常量,它自身的值可以改变,从而指向另一个常量。也称为指向常量的指针。

二、声明

1、指针常量:数据类型 * const 指针变量 eg:int * const p;
2、常量指针:数据类型 const * 指针变量 或者 const 数据类型 *指针变量 eg:int const * p; 或者 const int *p;
3、常量指针常量:数据类型 const * const 指针变量 或者 const 数据类型 * const 指针变量 eg:int const * const p; 或者 const int * const p;

三、使用

1、指针常量

//正确使用方法
int a, b;
int * const p = &a; //指针常量声明时必须初始化
*p = 20; //可以改变地址所存放的内容
a = 20;

//错误使用
int * const p;
p = &a;

//错误使用
int * const p = &a;
p = &b;//不能改变地址

2、常量指针
常量指针声明时初始化与不初始化均可

int a;
int const * p;
const int * p; //这两种写法等价
p = &a;
//正确使用方法
int a, b;
int const * p = &a;
p = &b; //可以改变地址
//错误使用方法
int a = 5;
int const * p = &a;
*p = 20;  //不可以通过指针修改指向的常量
//正确使用方法
int a = 5;
int const * p = &a;
a = 20;  //不可以通过指针来修改,但仍然可以通过原来的声明来修改

四、扩展

关于常变量的用法在c与c++的区别:
1、c++
c++中的const修饰的量叫常量,在c++中,声明常变量时必须初始化,且指针常量不能指向常变量。

const int a = 0; //正确
const int b; //错误
int * const p = &a; //错误

2、c
c语言中被const修饰的叫常变量,在c中,声明常变量时不一定要初始化,且指针常量可以指向常变量。

const int a = 0; //正确
const int b; //正确
int * const p = &a; //正确


总结

关于区分指针常量的一个小技巧:
1、const后的内容为不能修改的。例如:指针常量 int * const p = &a; 表示指针p的内容不能修改;
2、常量指针int const *p = &a; 则表示指针p所指向的内容不能修改。

扩展阅读资料

1、谭浩强 《c++程序设计》第二版 p181

你可能感兴趣的:(C/C++,c语言,c++)