C語言中文網 目錄
首頁 > 編程筆記 > C語言筆記 > 指針 閱讀:2,311

const修飾指針的三種效果,C語言const修飾指針詳解

前面講過,當一個變量用 const 修飾后就不允許改變它的值了。那么如果在定義指針變量的時候用 const 修飾會怎樣?同樣必須要在定義的時候進行初始化。比如:
int  a;
int  *p = &a;
當用 const 進行修飾時,根據 const 位置的不同有三種效果。原則是:修飾誰,誰的內容就不可變,其他的都可變。這三種情況在面試的時候幾乎是必考的,在實際編程中也是經常使用的,所以初學者一定要掌握。

1) const int*p=&a;

同樣 const 和 int 可以互換位置,二者是等價的。我們以放在最前面時進行描述。

當把 const 放最前面的時候,它修飾的就是 *p,那么 *p 就不可變。*p 表示的是指針變量 p 所指向的內存單元里面的內容,此時這個內容不可變。其他的都可變,如 p 中存放的是指向的內存單元的地址,這個地址可變,即 p 的指向可變。但指向誰,誰的內容就不可變。

這種用法常見于定義函數的形參。前面學習 printf 和 scanf,以及后面將要學習的很多函數,它們的原型中很多參數都是用 const 修飾的,這樣做的好處是安全!我們通過參數傳遞數據時,就把數據暴露了。而大多數情況下只是想使用傳過來的數據,并不想改變它的值,但往往由于編程人員個人水平的原因會不小心改變它的值。這時我們在形參中用 const 把傳過來的數據定義成只讀的,這樣就更安全了。這也是 const 最有用之處。

所以如果你不想改變某個參數傳過來的值,那么定義函數時就最好用 const 修飾這個參數,否則就不要用 const 修飾了。

2) int*const p=&a;

此時 const 修飾的是 p,所以 p 中存放的內存單元的地址不可變,而內存單元中的內容可變。即 p 的指向不可變,p 所指向的內存單元的內容可變。

3) const int*const p=&a;

此時 *p 和 p 都被修飾了,那么 p 中存放的內存單元的地址和內存單元中的內容都不可變。

綜上所述,使用 const 可以保護用指針訪問內存時由指針導致的被訪問內存空間中數據的誤更改。因為指針是直接訪問內存的,沒有拷貝,而有些時候使用指針訪問內存時并不是要改變里面的值,而只是要使用里面的值,所以一旦不小心誤操作把里面的數據改了就糟糕了。

但是這里需要注意的是,上面第 1 種情況中,雖然在 *p 前加上 const 可以禁止指針變量 p 修改變量 a 中的值,但是它只能“禁止指針變量 p 修改”。也就是說,它只能保證在使用指針變量 p 時,p 不能修改 a 中的值。但是我并沒有說 const 可以保護 a 禁止一切的修改,其他指向 a 的沒有用 const 修飾的指針變量照樣可以修改 a 的值,而且變量 a 自己也可以修改自己的值。下面寫一個程序看一下:
# include <stdio.h>
int main(void)
{   
    int a = 10;
    const int *p = &a;
    int * q = &a;
    *q = 20;
    printf("a = %d\n", a);
    a = 30;
    printf("a = %d\n", a);
    //*p = 30;  //這么寫就是錯的
    return 0;
}
輸出結果是:
a = 20
a = 30

可見,只有用 const 修飾過的指針變量 p 不能修改 a 中的內容,而沒有用 const 修飾過的指針變量 q 照樣可以修改 a 中的內容,而且 a 自己也可以重新給自己賦值。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo