C++指针常量和常量指针的区别(附带实例)
C++ 中,const 是常量限定符,通过 const 关键字可以把一个对象转换成一个常量。
例如:
const 除了可修饰 int、float、char 等常量外,还可以修饰指针,使指针指向一个常量,或使指针本身就是一个常量。
例如:
例如:
例如:
指向常量的指针与指针常量的区别在于:
【实例】指针与 const。
例如:
const int a = 1; //通过 const 关键字,定义 a 为整型常量,值为 1,后续不允许再赋值其中,const 关键字放在数据类型前后都可以,即 const int 和 int const 等效,都表示整型常量。
const 除了可修饰 int、float、char 等常量外,还可以修饰指针,使指针指向一个常量,或使指针本身就是一个常量。
C++指向常量的指针
如果指针指向的对象是一个常量,则后续不能通过引用指针(即 *p 形式)改变所指对象的内容。要存放常量对象的地址,也只能通过指向常量的指针。例如:
const int i = 9; //定义 i 为整型常量 const int *p = &i; //定义 p 为指向整型常量 i 的指针 *p = 3; //错误,不能通过*p 修改所指对象的内容
C++指针常量
指针常量,表示该指针为一个常量,即指针指向一个对象后,不可以再指向其他对象(本质是指针指向的地址不允许再发生改变)。例如:
int a1 = 10; //定义整型变量 a1 const int a2 = 20; //定义整型常量 a2 int *const p1 = &a1; //定义指针常量 p1,指向整型变量 a1,无法再指向其他对象,但对象内容可以改变 const int *const p2 = &a2; //定义指针常量 p2,指向整型常量 a2,无法再指向其他对象,且对象内容无法改变 其中,p1 和 p2 都是指针常量,后续均无法改变指向的地址空间。
C++指向常量的指针与指针常量的区别
如何区分指向常量的指针和指针常量呢?可以根据“*”和 const 关键字的位置来判断。例如:
const int *p = &i; //根据“*p”判断,这是一个指向整型常量的指针 int const *p = &i; //根据“*p”判断,这是一个指向整型常量的指针上述定义中,“=”左边的“*p”说明 p 是一个指针,指向一个整型常量(const int 或 in const)。
const int *const p = &i; //根据“*const p”判断,这是一个指针常量,指向一个整型常量 int *const p = &i; //根据“const p”判断,这是一个指针常量,指向一个普通整型上述定义中,“=”左边的“const p”说明 p 是一个指针常量,指向一个 const int 或 int 对象。
指向常量的指针与指针常量的区别在于:
- 指向常量的指针:指针本身可能不是一个常量对象,但指向的对象是一个常量,这说明可以让指针指向常量i,或者指向常量a,但无法通过该指针修改它所指向的常量。
- 指针常量:说明该指针就是一个常量,不能改变该指针指向的对象。
【实例】指针与 const。
#include <iostream> using std::cout; using std::endl; int main() { int i = 5; const int c = 99; //定义整型常量 const int *pR = &i; //定义指向常量的指针 pR,用来读取内存数据,可以改变地址 int *const pC = &i; //定义指针常量 pC,不能改变指向地址,但能改变地址中的内容 const int *const pCR = &i; //定义指针常量 pCR,指向整型常量,只能读内存数据,不能改变指向地址 cout << "三个指针都指向了同一个变量i,同一块内存" << endl; cout << "指向常量的指针 pR 操作:" << endl; //*pR = 6 //去掉语句前方法注释报错 cout << "通过赋值语句修改 i:" << endl; i = 100; cout << "i:" << i << endl; cout << "将 pR 的地址变成常量 c 的地址:" << endl; pR = &c; cout << "*pR:" << *pR << endl; cout << "指向常量的指针 pC 操作:" << endl; //*pC = &c; //去掉语句前方法注释,将报错 cout << "通过 pC 改变 i 值:" << endl; *pC = 6; cout << "i:" << i << endl; cout << "指向常量的指针常量 pCR 操作:" << endl; //pCR = &c; //报错 //*pCR = 100; //报错 cout << "通过 pCR 无法改变任何东西,真正做到了只读" << endl; return 0; }运行结果为:
三个指针都指向了同一个变量i,同一块内存
指向常量的指针 pR 操作:
通过赋值语句修改 i:
i:100
将 pR 的地址变成常量 c 的地址:
*pR:99
指向常量的指针 pC 操作:
通过 pC 改变 i 值:
i:6
指向常量的指针常量 pCR 操作:
通过 pCR 无法改变任何东西,真正做到了只读