最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中的指針常量、常量指針與常量指針常量詳解

 更新時間:2026年01月08日 08:28:30   作者:司徒軒宇  
本文深入解析了C++中指針與const的組合使用,包括指針常量、常量指針和常量指針常量三種類型,下面就拉介紹一下這三種的使用與區(qū)別,具有一定的參考價值,感興趣的可以了解一下

在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;
}

到此這篇關于C++中的指針常量、常量指針與常量指針常量詳解的文章就介紹到這了,更多相關C++ 指針常量、常量指針與常量指針常量內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言MFC基礎之計算器詳解

    C語言MFC基礎之計算器詳解

    這篇文章主要為大家介紹了MFC實現(xiàn)簡單的計算器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-08-08
  • C語言超詳細講解順序表的各種操作

    C語言超詳細講解順序表的各種操作

    大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內(nèi)容全部整理到了一起,希望能夠給剛剛進行學習數(shù)據(jù)結(jié)構的人帶來一些幫助,或者是已經(jīng)學過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05
  • C++的輸入與輸出和格式化輸出

    C++的輸入與輸出和格式化輸出

    這篇文章主要介紹了詳解C++中的輸入與輸出和格式化輸出,是C++入門學習中的基礎知識,需要的朋友可以參考,希望能夠給你帶來幫助
    2021-11-11
  • 簡單分析C++指針的操作和運算

    簡單分析C++指針的操作和運算

    這篇文章主要介紹了簡單分析C++指針的操作和運算的相關資料,需要的朋友可以參考下
    2015-07-07
  • C++修煉之構造函數(shù)與析構函數(shù)

    C++修煉之構造函數(shù)與析構函數(shù)

    本章節(jié)我們將學習類的6個默認成員函數(shù)中的構造函數(shù)與析構函數(shù),并對比C語言階段的內(nèi)容來學習它們的各自的特性,感興趣的同學可以參考閱讀
    2023-03-03
  • QT+Quick實現(xiàn)自定義組件的示例詳解

    QT+Quick實現(xiàn)自定義組件的示例詳解

    這篇文章主要為大家詳細介紹了如何利用QT+Quick實現(xiàn)自定義組件(按鈕、下拉菜單等),文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2022-11-11
  • C語言代碼 模塊化實現(xiàn)三子棋

    C語言代碼 模塊化實現(xiàn)三子棋

    這篇文章主要為大家詳細介紹了C語言 模塊化實現(xiàn)三子棋程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中的std::nothrow使用

    C++中的std::nothrow使用

    這篇文章主要介紹了C++中的std::nothrow使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言小游戲之簡易版三子棋(棋盤可自由擴展)

    C語言小游戲之簡易版三子棋(棋盤可自由擴展)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)三子棋游戲,還可以自由擴展棋盤大小,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++ 中的string_view和 span實際應用案例

    C++ 中的string_view和 span實際應用案例

    C++中string_view和span通過零開銷抽象提升內(nèi)存安全與表達力,解決原始指針的生命周期、邊界問題,保持性能優(yōu)勢,適用于現(xiàn)代連續(xù)內(nèi)存處理,非替代指針而是更優(yōu)選擇,本文給大家介紹C++中的string_view和 span實際應用案例,感興趣的朋友跟隨小編一起看看吧
    2025-08-08

最新評論

灵宝市| 大关县| 察隅县| 靖安县| 门源| 福贡县| 兰考县| 遵义市| 沾益县| 菏泽市| 凉城县| 三江| 乌苏市| 大同县| 岑巩县| 金沙县| 石门县| 聊城市| 吴桥县| 额敏县| 军事| 增城市| 普兰店市| 东丰县| 习水县| 伊金霍洛旗| 渭南市| 公主岭市| 五大连池市| 凤山县| 永新县| 杭州市| 贵州省| 星座| 台州市| 观塘区| 长治市| 平阴县| 白河县| 龙海市| 金门县|