C++指向常量的指针和常指针

C++指向常量的指针和常指针

指向常量的指针

通常情况下,可以通过指针去修改指针指向的内容.但是在某些情况下,只希望通过指针去访问指针指向的内容,不想修改.比如只想通过树根结点的指针去遍历输出树中所有结点的内容,不修改.这时候就可以使用指向常量的指针,防止意外修改.
看下面的代码

const int* u;

const int* u;可以读作:u是一个指针,该指针指向不能通过该指针修改的内容.重点在不能通过该指针修改的内容,也就是说u指向的内容不能通过u来修改,但是可以通过别的方法修改.看下面的代码和注释.

#include <iostream>
using namespace std;
int main() {
    int a = 3;
    const int* u;
    u = &a; //初始化u
    cout << "*u=" << *u << endl;

    /* 试图通过u修改u指向的内容,直接报错.
        *u = 3; 
        cout << "*u=" << *u << endl;
    */

    /*通过另外一个变量的指针修改u指向的内容是正确的.*/
    int b = 4;
    u = &b;
    cout << "*u=" << *u << endl;

    /*通过另外一个指针修改u指向的内容也是正确的.*/
    int *c = &b;
    *c = 100;
    cout << "*u=" << *u << endl;
}

指向常量的指针还有一种等价的定义方式, int const* u; int const* u和const int* u的意义完全相同.

常指针

看下面的代码.

#include <iostream>
using namespace std;
int main() {
    int d = 1;
    int* const w = &d;
    return 0;
}

int* const w = &d读作:w是一个指针,这个指针是一个不能修改的(int型)指针.重点在不能修改的指针,也就是说w不可以被修改,但w指向的内容是可以修改的.看下面的代码和注释.

#include <iostream>
using namespace std;
int main() {
    int d = 1;
    int* const w = &d;

    /* 试图修改w,直接报错.
    int e =2;
    w = &e;
    */

    /*可以修改w指向的内容*/
    *w = 6;
    cout << "*w=" << *w << endl;
    *w = 7;
    cout << "*w=" << *w << endl;
    return 0;
}

参考资料
Bruce Eckel. Thinking in C++, Volume 1, 2nd Edition.pp360-362. 2000.

posted on   荷楠仁  阅读(263)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义

导航

统计

点击右上角即可分享
微信分享提示