C++中的指針常量、常量指針與常量指針常量詳解
在C++編程中,指針和const關鍵字的組合使用是每個開發(fā)者必須掌握的重要概念。正確理解這些概念不僅能幫助我們編寫更安全的代碼,還能提升代碼的可讀性和維護性。本文將深入探討三種常見的指針與const組合:指針常量、常量指針和常量指針常量。
什么是const關鍵字?
在深入討論之前,我們先簡單回顧一下const關鍵字的作用。const用于定義常量,表示被修飾的變量或?qū)ο蟛豢尚薷摹.攃onst與指針結(jié)合時,根據(jù)其位置的不同,會產(chǎn)生不同的語義。
1. 指針常量(Pointer Constant)
指針常量指的是指針本身是常量,即指針的指向(內(nèi)存地址)不可改變,但可以通過指針修改指向的值。
聲明語法
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;
}
特點總結(jié)
- 指針的指向固定,不可改變
- 可以通過指針修改指向的值
- 必須在聲明時初始化
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 << "現(xiàn)在指向b: *ptr = " << *ptr << endl;
// *ptr = 30; // ? 錯誤:不能修改指向的值
// 編譯錯誤:error: assignment of read-only location '*ptr'
// 但可以直接修改變量本身
b = 40;
cout << "直接修改b后: *ptr = " << *ptr << endl;
return 0;
}
特點總結(jié)
- 不能通過指針修改指向的值
- 可以改變指針的指向
- 不要求在聲明時初始化
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;
}
特點總結(jié)
- 指針的指向固定,不可改變
- 不能通過指針修改指向的值
- 必須在聲明時初始化
快速記憶技巧
方法一:看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. 函數(shù)參數(shù)中的使用
// 常量指針:保護數(shù)據(jù)不被意外修改
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'; // ? 可以修改內(nèi)容
// fixedPtr = str2; // ? 錯誤:不能改變指向
cout << message << endl;
cout << fixedPtr << endl;
return 0;
}
3. 面向?qū)ο缶幊讨械膽?/h3>
class MyClass {
private:
int data;
public:
MyClass(int d) : data(d) {}
// 常量成員函數(shù):不能修改成員變量
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; // ? 可以調(diào)用const成員函數(shù)
// ptr1->setData(300); // ? 錯誤:不能調(diào)用非const成員函數(shù)
// 指針常量
MyClass* const ptr2 = &obj;
ptr2->setData(150); // ? 可以修改對象
// ptr2 = &constObj; // ? 錯誤:不能改變指向
return 0;
}
class MyClass {
private:
int data;
public:
MyClass(int d) : data(d) {}
// 常量成員函數(shù):不能修改成員變量
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; // ? 可以調(diào)用const成員函數(shù)
// ptr1->setData(300); // ? 錯誤:不能調(diào)用非const成員函數(shù)
// 指針常量
MyClass* const ptr2 = &obj;
ptr2->setData(150); // ? 可以修改對象
// ptr2 = &constObj; // ? 錯誤:不能改變指向
return 0;
}
到此這篇關于C++中的指針常量、常量指針與常量指針常量詳解的文章就介紹到這了,更多相關C++ 指針常量、常量指針與常量指針常量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

