首页 > 编程笔记 > C++笔记 阅读:25

C++指针常量和常量指针的区别(附带实例)

C++ 中,const 是常量限定符,通过 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 对象。

指向常量的指针与指针常量的区别在于:
【实例】指针与 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 无法改变任何东西,真正做到了只读

相关文章