C++中的指针常量、常量指针与常量指针常量详解

 更新时间:2026年01月08日 08:28:30   作者:司徒轩宇  
本文深入解析了C++中指针与const的组合使用,包括指针常量、常量指针和常量指针常量三种类型,下面就拉介绍一下这三种的使用与区别,具有一定的参考价值,感兴趣的可以了解一下

在C++编程中,指针和const关键字的组合使用是每个开发者必须掌握的重要概念。正确理解这些概念不仅能帮助我们编写更安全的代码,还能提升代码的可读性和维护性。本文将深入探讨三种常见的指针与const组合:指针常量、常量指针和常量指针常量。

什么是const关键字?

在深入讨论之前,我们先简单回顾一下const关键字的作用。const用于定义常量,表示被修饰的变量或对象不可修改。当const与指针结合时,根据其位置的不同,会产生不同的语义。

1. 指针常量(Pointer Constant)

指针常量指的是指针本身是常量,即指针的指向(内存地址)不可改变,但可以通过指针修改指向的值。

声明语法

type* const ptr = 初始地址;

代码示例

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    int* const ptr = &a;  // 必须在声明时初始化
    
    cout << "初始值: a = " << a << endl;
    
    *ptr = 30;  // ✅ 正确:可以修改指向的值
    cout << "修改后: a = " << a << endl;
    
    // ptr = &b;  // ❌ 错误:不能改变指针的指向
    // 编译错误:error: assignment of read-only variable 'ptr'
    
    return 0;
}

特点总结

  • 指针的指向固定,不可改变
  • 可以通过指针修改指向的值
  • 必须在声明时初始化

2. 常量指针(Pointer to Constant)

常量指针指的是指向的值是常量,不能通过指针修改指向的值,但可以改变指针的指向。

声明语法

const type* ptr;  // 或 type const* ptr;

代码示例

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    const int* ptr = &a;
    
    cout << "a = " << a << ", *ptr = " << *ptr << endl;
    
    ptr = &b;  // ✅ 正确:可以改变指向
    cout << "现在指向b: *ptr = " << *ptr << endl;
    
    // *ptr = 30;  // ❌ 错误:不能修改指向的值
    // 编译错误:error: assignment of read-only location '*ptr'
    
    // 但可以直接修改变量本身
    b = 40;
    cout << "直接修改b后: *ptr = " << *ptr << endl;
    
    return 0;
}

特点总结

  • 不能通过指针修改指向的值
  • 可以改变指针的指向
  • 不要求在声明时初始化

3. 常量指针常量(Constant Pointer to Constant)

常量指针常量是指针本身和指向的值都是常量,既不能改变指针的指向,也不能通过指针修改指向的值。

声明语法

const type* const ptr = 初始地址;

代码示例

#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 20;
    const int* const ptr = &a;
    
    cout << "a = " << a << ", *ptr = " << *ptr << endl;
    
    // *ptr = 30;  // ❌ 错误:不能修改指向的值
    // ptr = &b;   // ❌ 错误:不能改变指针的指向
    
    // 但可以直接修改变量本身(前提是变量不是const)
    a = 40;
    cout << "直接修改a后: *ptr = " << *ptr << endl;
    
    return 0;
}

特点总结

  • 指针的指向固定,不可改变
  • 不能通过指针修改指向的值
  • 必须在声明时初始化

快速记忆技巧

方法一:看const相对于*的位置

const int* ptr1;    // const在*左边 → 常量指针(指向常量)
int const* ptr2;    // const在*左边 → 常量指针(指向常量)
int* const ptr3;    // const在*右边 → 指针常量(指针是常量)
const int* const ptr4; // 两边都有const → 常量指针常量

口诀:“左定值,右定向,两边定都定”

  • const在*左边:指向的值是常量
  • const在*右边:指针本身是常量
  • 两边都有const:都不可变

方法二:从右向左读法

int* const ptr;        // ptr is a const pointer to int
const int* ptr;        // ptr is a pointer to const int
const int* const ptr;  // ptr is a const pointer to const int

实际应用场景

1. 函数参数中的使用

// 常量指针:保护数据不被意外修改
void printArray(const int* arr, int size) {
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
        // arr[i] = 0;  // ❌ 错误:不能修改
    }
    cout << endl;
}

// 指针常量:固定操作某个对象
void incrementValue(int* const ptr) {
    *ptr += 1;  // ✅ 可以修改值
    // ptr = nullptr;  // ❌ 错误:不能改变指向
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int value = 10;
    
    printArray(arr, 5);
    incrementValue(&value);
    cout << "value = " << value << endl;
    
    return 0;
}

2. 字符串处理

#include <iostream>
#include <cstring>
using namespace std;

int main() {
    char str1[] = "Hello";
    char str2[] = "World";
    
    // 常量指针:指向字符串常量
    const char* message = "Immutable string";
    // *message = 'h';  // ❌ 错误:字符串常量不可修改
    
    // 指针常量:固定指向某个字符串
    char* const fixedPtr = str1;
    fixedPtr[0] = 'h';  // ✅ 可以修改内容
    // fixedPtr = str2;  // ❌ 错误:不能改变指向
    
    cout << message << endl;
    cout << fixedPtr << endl;
    
    return 0;
}

3. 面向对象编程中的应用

class MyClass {
private:
    int data;
public:
    MyClass(int d) : data(d) {}
    
    // 常量成员函数:不能修改成员变量
    int getData() const {
        return data;
    }
    
    void setData(int d) {
        data = d;
    }
};

int main() {
    MyClass obj(100);
    const MyClass constObj(200);
    
    // 指向常量的指针
    const MyClass* ptr1 = &constObj;
    cout << ptr1->getData() << endl;  // ✅ 可以调用const成员函数
    // ptr1->setData(300);  // ❌ 错误:不能调用非const成员函数
    
    // 指针常量
    MyClass* const ptr2 = &obj;
    ptr2->setData(150);  // ✅ 可以修改对象
    // ptr2 = &constObj;  // ❌ 错误:不能改变指向
    
    return 0;
}

到此这篇关于C++中的指针常量、常量指针与常量指针常量详解的文章就介绍到这了,更多相关C++ 指针常量、常量指针与常量指针常量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 数据结构课程设计- 解析最少换车次数的问题详解

    数据结构课程设计- 解析最少换车次数的问题详解

    数据结构课程设计- 解析最少换车次数的问题详解
    2013-05-05
  • C语言大小端模式、判断大小端、大小端转换方法详解

    C语言大小端模式、判断大小端、大小端转换方法详解

    这篇文章主要介绍了C语言大小端模式、判断大小端、大小端转换的相关资料,大端和小端是数据在内存中的存储方式,大端模式下高字节存于低地址,小端模式则相反,大小端问题由数据类型多字节存储引起,不同选择形成不同存储模式,需要的朋友可以参考下
    2024-10-10
  • qt5之QFile读写文件功能详解

    qt5之QFile读写文件功能详解

    这篇文章主要为大家详细介绍了qt5之QFile读写文件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • 快速解决boost库链接出错的问题(分享)

    快速解决boost库链接出错的问题(分享)

    下面小编就为大家带来一篇快速解决boost库链接出错的问题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • C++ STL标准库之std::list使用介绍及用法详解

    C++ STL标准库之std::list使用介绍及用法详解

    std::list是支持常数时间从容器任何位置插入和移除元素的容器,下面这篇文章主要给大家介绍了关于C++ STL标准库之std::list使用介绍及用法详解的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • 解析C#中不一样的大小写转换

    解析C#中不一样的大小写转换

    本篇文章是对C#中大小写转换的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 从C语言过渡到C++之基本变化

    从C语言过渡到C++之基本变化

    在之前的C++代码训练营系列中,我试图用完成具体项目的方式给大家介绍C++,但后来大家反馈说这样从C过渡到C++有点跟不上。于是我又专门设计了这个《从C到C++》的过渡专题,我准备通过10篇文章介绍一下C++和C的重要区别。
    2017-07-07
  • C语言--数字交换题目详解

    C语言--数字交换题目详解

    本文通过代码给大家介绍c语言数字交换的题目,通过实例代码给大家讲解的很详细,具有一定的参考借鉴价值,对c语言感兴趣的朋友一起看看吧
    2021-08-08
  • C++实现贪心算法(Greedy Algorithm)的应用场景示例

    C++实现贪心算法(Greedy Algorithm)的应用场景示例

    贪心算法是一种通过每一步选择当前最优解来推动全局最优的启发式算法,它适用于满足贪心选择性质和最优子结构的问题,但并不总是能找到全局最优解,贪心算法的关键在于设计正确的策略并证明其有效性,应用范围广泛,包括资源调度、编码压缩、路径规划和网络优化等
    2025-11-11
  • Qt实现拖动单个控件移动的示例代码

    Qt实现拖动单个控件移动的示例代码

    做惯了静态图,今天来搞一搞动态图吧!本文将利用Qt实现拖动单个控件移动效果,文中的示例代码讲解详细,感兴趣的可以动手尝试一下
    2022-06-06

最新评论