溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++中常量與指針有什么用

發(fā)布時(shí)間:2021-06-28 09:50:33 來(lái)源:億速云 閱讀:169 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了C++中常量與指針有什么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

和指針聯(lián)用有佷微妙的地方,之前一直佷暈,現(xiàn)在來(lái)繼續(xù)研究下。諸如以下:

int const;
const int;
const int* p;
int const* p;
int* const p;
const int* const p;

const 是一種處理符號(hào)常量的方法,以 const 聲明的變量,一般首字母大寫,聲明之后無(wú)法被修改。相比于 define,const 會(huì)顯式的指定類型。除定義符號(hào)外,一般可用于函數(shù)聲明,表示函數(shù)不會(huì)修改任何值;用于參數(shù),表示函數(shù)不會(huì)修改參數(shù);甚至可以用于聲明數(shù)組的長(zhǎng)度。

解讀

const默認(rèn)作用于其左邊的東西。左邊沒(méi)東西的情況下,作用于其右邊的東西。1

  1. const int* p,只有右邊有東西,修飾的為 int,所以數(shù)值不能被修改。在與 * 結(jié)合,意思是*p不能被修改,其它的都可以。即不可通過(guò)該指針改變其指向的內(nèi)容,但可改變指針本身所指向的地址。

  2. int const* p,先作用于左側(cè)的 int 為 int const,在疊加上右側(cè)的 *,所以修飾的為 int* p,所以,*p不能被修改,其它的都可以。即不可通過(guò)該指針改變其指向的內(nèi)容,但可改變指針本身所指向的地址。也就是,和上面的是一樣的。

  3. int* const p,左邊是 *,所以 const 作用于指針,指向一個(gè) int 變量。即不可以修改 p,但可以修改 *p,即不可改變指向的地址。

  4. const int* const p,對(duì)于第一個(gè) const,左邊沒(méi)東西,修飾右邊的 int,指向的值不能修改;對(duì)于第二個(gè) const 修飾 *,指針不能修改。即不可改變指針本身所指向的地址,也不可通過(guò)指針改變其指向的內(nèi)容。同 int const* const p。

  5. int const* const* p,第一個(gè) const 修飾 int,第二個(gè) const 修飾第一個(gè) *,也就是,指向 const int* const p 的指針,最后一個(gè) * 沒(méi)有被修飾,因此可以指向其它變量。int const* const* const 就不可以了。

  6. 之后再出現(xiàn)此類情況,也可以慢慢分析滿天飛的 const 和指針。

一些例子

為了更好的理解上述內(nèi)容,這里來(lái)舉一些例子。常見(jiàn)的一般有兩種選擇:

  • 常指針指向一個(gè)變量,防止修改指針修改變量值

  • 常指針指向一個(gè)常量

  • 非常指針指向常量(錯(cuò)誤)

先看第一種情況:解引用只是取出指向內(nèi)存區(qū)域的值,因此指向內(nèi)存區(qū)域的值是可以直接修改的,但不能通過(guò)指針修改。

int main (){
    int a{34};
    const int *p = &a;
    // *p 為 const,不能被修改
    // 錯(cuò)誤
    // *p ++;
    // p 指向的不是常量,因此,可以修改 a
    a ++;
    std::cout << *p << std::endl;
    
    int b{12};
    p = &b;
    std::cout << *p << std::endl;
    return 0;
}

對(duì)于第二種情況:不能修改變量,也不能修改常量。

int main (){

    const int a{34};
    // *p 為 const,不能被修改,a 也不能被修改
    const int *p = &a;
    std::cout << *p << std::endl;

    int b{12};
    p = &b;
    std::cout << *p << std::endl;

    return 0;
}

對(duì)于第三種情況:修改指針來(lái)修改常量會(huì)顯得佷荒謬,因此編譯會(huì)直接報(bào)錯(cuò):

int main (){
    const int a{34};
    // error: invalid conversion from 'const int*' to 'int*'
    int *p = &a;
    *p ++;
    std::cout << *p ;
    return 0;
}

二級(jí)指針

之前說(shuō)到,常指針可以指向變量,但是涉及二級(jí)指針后,情況又會(huì)發(fā)生逆轉(zhuǎn)。

int main (){

    const int a{12};
    const int** p1;
    int* p2;

    // error: invalid conversion from 'int**' to 'const int**'
    p1 = &p2;
    *p1 = &a;

    *p2 = 10;

    return 0;
}

如果上述代碼通過(guò),那么完全可以通過(guò) p2 指針修改常量。因此我們可以得到以下結(jié)論:

若數(shù)據(jù)類型本身不是指針,可以將 const 數(shù)據(jù)或非 const 數(shù)據(jù)的地址賦給指向 const 的指針,但指針可以修改,指向別的值。因此,const 修飾的數(shù)組不能傳參給非常量指針。

如果數(shù)據(jù)類型是指針,非 const 數(shù)據(jù)的地址只能賦值給非 const 指針,如二級(jí)指針中,p1 = &p2 是錯(cuò)誤的。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“C++中常量與指針有什么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI