1. 程式人生 > 實用技巧 >c++指標常量和常量指標概述

c++指標常量和常量指標概述

個人理解,歡迎指正

這個簡單,簡單,簡單(不要有心裡壓力:認為很難)

本文將會解決:

  A、變與不變

  B、判斷指標常量和常量指標。

  C、常量指標指標常量。本文不涉及。

1、概述

  指標: 說到底,還是地址, 但是這個地址需要用一個變數儲存起來,為什麼? 因為地址隨機化。每個程序被建立的時的地址時不一樣,基址不一樣,當前對應具體的地址也是變化的。 公式: 實際地址 = 基址 + 偏移 。 這個公式中,基址和實際地址是兩個變數,實際地址隨基址的變化而變化。(扯遠了,這就是為什麼要用一個變數來儲存地址的原因(個人猜想))。所以,咱們常說的指標其實就包含了兩部分: 指向的地址 變數本身的地址

  實際使用中,我們經常的是指向的地址,很少用到變數本身的地址。 指標變數名本身就代表指向的地址, 比如 char *parr = "1234"; parr 代表了字串“1234”的起始地址,而非parr變數本身的地址。 &parr 才表示變數本身的地址。

2、形式

  這裡,以int為例。

int a = 1;
int b = 2;

  

  A、指標常量: 型別 * const 指標變數名。比如:

int * const pp = &a;

  B、常量指標: const 型別 * 指標變數名。 比如

const int *p = &a;

  形如上面,如果不寫出來,怎麼知道哪個是 指標常量常量指標

3、判斷(重點)

  細心點就能發現, 這兩個名詞中的關鍵字就兩個, 指標和常量。 const 就表示的是常量, * 理解為地址解析運算子(個人見解),簡單點,我們就理解為指標。

  A、解讀順序, 以指標表示式為例,預設從左到右。

  B、舉例說明:cosnt int *p = & a; 首先解讀的是 const ,其次才是 * (地址解析運算子)。所以,這是個 常量指標。誰在前,就先讀誰。const 在前, 就先讀 const, * 在前,就先讀 * 。

  C、還是不會判斷? 找幾個例子,多試試就會了。 很簡單。

 

4、定義

常量指標 指向的地址可以變, 但是指向地址的內容不能變
指標常量 指向的地址不能變, 但是指向地址的內容可以變

5、變與不變

  A、這裡有一個參考點: 那就是const。

  B、const 的位置決定了什麼變,什麼不變。 const 後面是什麼(為了方便理解,暫時先不看地址解析運算子 * ), 變數名 還是 型別

   C、舉例

const int *p = &a;

  這是一個常量指標,,const 後面 型別 int (為了方便理解,暫時先不看地址解析運算子 * ),那麼 p存放地址的內容是不能變的。 所以,當執行 *p = 2; 就會提示出錯。

  再有:

int * const pp = &a;

  這是一個指標常量, const 後面是指標變數名 pp(先不看 * ), 那麼,pp存放的地址不能變,但是pp 存放地址的內容可以變.所以, 執行 *pp = 2; 就可以修改成功。

6、一個例子

  上面的還是太抽象,來個實際的幫助理解。

  A、定義和宣告如下(自己先判斷下,哪個是指標常量,哪個是常量指標):

int a = 1;
int b = 2;
const int *p = &a;
int * const pp = &a;

  B、檢視上面的變數的地址和值是多少

cout << "\n\n &a = " << &a << ", a= " << a << endl;
cout << "&b = " << &b << ", b= " << b << "\n\n";
cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

  C、我這裡顯示的結果:

  D、解讀

    上面的程式碼發現, 指標變數名就是指標指向內容的地址

  

  E、下面嘗試修改指標指向的內容。

cout << "\n\n--下面開始嘗試修改值----\n\n";
p = &b; // 常量指標, 指向的地址可以變, 但是指向地址的內容不能變, OK
cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
// *p = 2; // 常量指標, 指向的地址可以變, 但是指向地址的內容不能變。error.
*pp = 3; // 指標常量, 指向的地址不能變, 但是指向地址的內容可以變。
cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

   D、結果:

7、原始碼:

  

int a = 1;
    int b = 2;
    const int *p = &a;
    int * const pp = &a;

    cout << "\n\n&a = " << &a << ", a= " << a << endl;
    cout << "&b = " << &b << ", b= " << b << "\n\n";

    cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
    cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;

    cout << "\n\n--下面開始嘗試修改值----\n\n";
    p = &b;        // 常量指標, 指向的地址可以變, 但是指向地址的內容不能變, OK 
    cout << "&p = " << &p << ", p = " << p << ", *p = " << *p << endl;
    // *p = 2;    // 常量指標, 指向的地址可以變, 但是指向地址的內容不能變。error. 
    *pp = 3;    // 指標常量, 指向的地址不能變, 但是指向地址的內容可以變。
    cout << "&pp = " << &pp << ", pp = " << pp << ", *pp = " << *pp << endl;