const int * p,int const *p, int * const p, const int *const p 搞不清楚?

本文介绍了C++中const关键字修饰指针的四种情况,通过实例代码展示了const如何影响指针及其指向的内容是否可修改,总结了快速记忆规则:从const位置开始,向左找到最近的标识符决定其不可修改。文章帮助读者掌握const指针的使用和理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、废话不多说,直接来结论

变量含义
const int *p    指针p可以修改,*p不可修改
int const *p   指针p可以修改,*p不可修改
int *const p指针p不可以修改,*p可以修改
const int * const p指针p不可以修改,*p不可以修改

显然:const int *p 与int const *p一个意思。

速记结论:忽略类型(int),*代表取内容(解引用),变量名代表指针(p),从const位置开始,然后从左往右看,const 与谁最近,谁就不可以修改。如:对于const int *p,从左往右看,const 与 * 最近,所以*p就不可以修改,而对于int *const p,由于*在const左边,所以*无效,从左往右看,const 与 p最近,所以p不可以修改。

二、案例

1、const int *p         指针p可以修改,*p不可修改

#include <iostream>

using namespace std;


int main()
{
    int a = 10;
    int b = 20;
    const int *p = &a;  // 指针p可以修改,*p不可以修改
    
    cout << "after const int *p = &a" << endl; 
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
    
    // *p = 200;    // 错误,*p不可以修改
    // a = 200;
    
    p = &b;
    a = 200;    // 正确,*p不可以修改,但是a可以修改
    cout << "after p = &b, a = 200" << endl;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;


    return 0;
}

2、int const *p         指针p可以修改,*p不可以修改

#include <iostream>

using namespace std;


int main()
{
    int a = 10;
    int b = 20;
    int const *p = &a;  // 指针p可以修改,*p不可以修改
    
    cout << "after const int *p = &a" << endl; 
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
    
    // *p = 200;    // 错误,*p不可以修改
    // a = 200;
    
    p = &b;
    a = 200;    // 正确,*p不可以修改,但是a可以修改
    cout << "after p = &b, a = 200" << endl;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;


    return 0;
}

3、int * const p         指针p不可以修改,*p可以修改

#include <iostream>

using namespace std;


int main()
{
    int a = 10;
    int b = 20;
    int *const p = &a;  // 指针p不可以修改,*p可以修改
    
    cout << "after const int *p = &a" << endl; 
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
    
    *p = 100;   // 正确,*p可以修改
    // p = &b;  // 错误,指针p不可以修改
    cout << "after *p = 100" << endl;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;

    a = 200;    // 正确,*p可以修改,但是a也可以修改
    cout << "after a = 200" << endl;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;


    return 0;
}

4、 const int * const p 指针p不可以修改,*p不可以修改

#include <iostream>

using namespace std;


int main()
{
    int a = 10;
    int b = 20;
    const int *const p = &a;  // 指针p不可以修改,*p不可以修改
    
    cout << "after const int *p = &a" << endl; 
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;
    
    // *p = 100;   // 错误,*p不可以修改
    // p = &b;  // 错误,指针p不可以修改

    a = 200;    // 正确,*p不可以修改,但是a可以修改
    cout << "after a = 200" << endl;
    cout << "a = " << a << endl;
    cout << "*p = " << *p << endl;


    return 0;
}

三、总结

        速记结论:忽略类型(int),*代表取内容(解引用),变量名代表指针(p),从const位置开始,然后从左往右看,const 与谁最近,谁就不可以修改。如:对于const int *p,从左往右看,const 与 * 最近,所以*p就不可以修改,而对于int *const p,由于*在const左边,所以*无效,从左往右看,const 与 p最近,所以p不可以修改。

        记住这个结论以后,再也不怕const修饰的指针了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值