C++中的指针常量、常量指针与常量指针常量详解
在C编程中指针和const关键字的组合使用是每个开发者必须掌握的重要概念。正确理解这些概念不仅能帮助我们编写更安全的代码还能提升代码的可读性和维护性。本文将深入探讨三种常见的指针与const组合指针常量、常量指针和常量指针常量。什么是const关键字在深入讨论之前我们先简单回顾一下const关键字的作用。const用于定义常量表示被修饰的变量或对象不可修改。当const与指针结合时根据其位置的不同会产生不同的语义。1. 指针常量Pointer Constant指针常量指的是指针本身是常量即指针的指向内存地址不可改变但可以通过指针修改指向的值。声明语法1type*constptr 初始地址;代码示例1234567891011121314151617#include iostreamusingnamespacestd;intmain() {inta 10, b 20;int*constptr a;// 必须在声明时初始化cout 初始值: a a endl;*ptr 30;// ✅ 正确可以修改指向的值cout 修改后: a a endl;// ptr b; // ❌ 错误不能改变指针的指向// 编译错误error: assignment of read-only variable ptrreturn0;}特点总结指针的指向固定不可改变可以通过指针修改指向的值必须在声明时初始化2. 常量指针Pointer to Constant常量指针指的是指向的值是常量不能通过指针修改指向的值但可以改变指针的指向。声明语法1consttype* ptr;// 或 type const* ptr;代码示例123456789101112131415161718192021#include iostreamusingnamespacestd;intmain() {inta 10, b 20;constint* 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;return0;}特点总结不能通过指针修改指向的值可以改变指针的指向不要求在声明时初始化3. 常量指针常量Constant Pointer to Constant常量指针常量是指针本身和指向的值都是常量既不能改变指针的指向也不能通过指针修改指向的值。声明语法1consttype*constptr 初始地址;代码示例123456789101112131415161718#include iostreamusingnamespacestd;intmain() {inta 10, b 20;constint*constptr a;cout a a , *ptr *ptr endl;// *ptr 30; // ❌ 错误不能修改指向的值// ptr b; // ❌ 错误不能改变指针的指向// 但可以直接修改变量本身前提是变量不是consta 40;cout 直接修改a后: *ptr *ptr endl;return0;}特点总结指针的指向固定不可改变不能通过指针修改指向的值必须在声明时初始化快速记忆技巧方法一看const相对于*的位置1234constint* ptr1;// const在*左边 → 常量指针指向常量intconst* ptr2;// const在*左边 → 常量指针指向常量int*constptr3;// const在*右边 → 指针常量指针是常量constint*constptr4;// 两边都有const → 常量指针常量口诀“左定值右定向两边定都定”const在*左边指向的值是常量const在*右边指针本身是常量两边都有const都不可变方法二从右向左读法123int*constptr;// ptr is a const pointer to intconstint* ptr;// ptr is a pointer to const intconstint*constptr;// ptr is a const pointer to const int实际应用场景1. 函数参数中的使用12345678910111213141516171819202122232425// 常量指针保护数据不被意外修改voidprintArray(constint* arr,intsize) {for(inti 0; i size; i) {cout arr[i] ;// arr[i] 0; // ❌ 错误不能修改}cout endl;}// 指针常量固定操作某个对象voidincrementValue(int*constptr) {*ptr 1;// ✅ 可以修改值// ptr nullptr; // ❌ 错误不能改变指向}intmain() {intarr[] {1, 2, 3, 4, 5};intvalue 10;printArray(arr, 5);incrementValue(value);cout value value endl;return0;}2. 字符串处理12345678910111213141516171819202122#include iostream#include cstringusingnamespacestd;intmain() {charstr1[] Hello;charstr2[] World;// 常量指针指向字符串常量constchar* message Immutable string;// *message h; // ❌ 错误字符串常量不可修改// 指针常量固定指向某个字符串char*constfixedPtr str1;fixedPtr[0] h;// ✅ 可以修改内容// fixedPtr str2; // ❌ 错误不能改变指向cout message endl;cout fixedPtr endl;return0;}3. 面向对象编程中的应用1234567891011121314151617181920212223242526272829303132classMyClass {private:intdata;public:MyClass(intd) : data(d) {}// 常量成员函数不能修改成员变量intgetData()const{returndata;}voidsetData(intd) {data d;}};intmain() {MyClass obj(100);constMyClass constObj(200);// 指向常量的指针constMyClass* ptr1 constObj;cout ptr1-getData() endl;// ✅ 可以调用const成员函数// ptr1-setData(300); // ❌ 错误不能调用非const成员函数// 指针常量MyClass*constptr2 obj;ptr2-setData(150);// ✅ 可以修改对象// ptr2 constObj; // ❌ 错误不能改变指向return0;}到此这篇关于C中的指针常量、常量指针与常量指针常量详解的文章就介绍到这了