由上一節,我們知道了,指標就是地址,而變數的指標就是變數的地址,存放變數地址的變數就是指標變數。指標變數可以指向另一個變數,在程式中使用" * "來表示這種指向關係。

1.指標變數的定義

        指標的定義依然遵循先定義後使用的原則,在使用前必須先定義,指定其型別編譯器再據此為其分配記憶體單元。

        定義指標變數的一般格式:

        型別識別符號 * 指標變數名

        例如:int   *p ;    float   *p;   分別是指向整形變數的指標變數p,指向浮點型別變數的指標變數q。

注意:定義指標變數時,型別識別符號一旦確定就不能改變,如果定義了一個指向整型變數的指標變數,那麼它就不能再指向其他型別的變量了。也就是說一個指標變數只能指向同一種類型的變數。

2.取地址運算子(&)

        為了使用指標,c語言提供了兩個特別的運算子——取地址運算子&和取值運算子*。

        在定義了一個指標變數後,只為其分配了相應的記憶體單元用於存放指標的值,而這個指標變數並沒有指向某個特定的變數,因此,在使用指標時,也需要將指標變數進行初始化,因為指標變數存放的是變數的地址,因此對指標初始化就是將某個變數的地址賦給它。

例如: 

int  x=5,*p;   p=&x;   (將x的地址賦給了指標變數p,那麼指標變數p就指向了x)

        程式中定義的變數和儲存器中的儲存單元相對應,變數名字和儲存單元的地址對應,變數內容和儲存單元中所儲存的資料對應。

當然上述語句也可以寫成  :

int x=5;
int *p=&x;
還可以寫成:
int x=5,*p=&x;
        使用c語言程式設計時,每個變數都有變數名,還有變數儲存的值。當程式被編譯和載入後,變數名就變成了計算機記憶體中的地址,而變數的值就存放在該地址中或從該地址開始的連續幾個記憶體單元中。因此,變數名和變數值實際上就是變數地址和地址中存放的值。

3.取值運算子(*)

        如果指標變數指向了某個變數,那麼就可以使用取值運算子*來訪問變數中的內容。

例如

printf("%d\n",*p);
        如果指標變數p指向整形變數x,那麼就可以用下面的語句列印變數x的值。

4.指標變數的賦值

        和其他變數一樣,也可以使用賦值運算子為指標變數賦值,但要保證兩個指標變數的型別相同。

假設有如下變數定義:

int i,j,*p,*q;
p=&i;
q=&j;
        這兩句將變數i和j的地址分別賦值給指標變數p和q;

        當q=p時,這條語句就是將指標變數p的內容賦值給指標變數q,其結果如下圖所示:

        執行了q=p後,執行該條語句,指標變數p和q都指向了同一個變數i,因此指標變數p和q中存放的都是變數i的地址&i。變數i此時並沒有初始化,只為其分配了記憶體單元。

注意理解:q=p;和*q=*p

        前者為指標變數q賦值,即將指標變數p中存放的某個變數的地址賦值給q。顯然,賦值後,q和p就指向了同一個變數。(賦值的內容是指標,也就是地址)  

        後者將p指向變數的賦值給q指向的變數。(賦值的內容是數值)

例子:

p=&i;
q=&j;
i=2;
j=3;
對上面程式碼分別執行q=p;*q=*p;流程圖如下圖:

5.例子講解

通過指標變數訪問整形變數

#include <stdio.h>
int main(){
    int a=100,b=10;
    int *pointer_1,*pointer_2;
    pointer_1=&a;
    pointer_2=&b;
    printf("a=%d,b=%d\n",a,b);
    printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); 
    return 0;
}
a=100,b=10
*pointer_1=100,*pointer_2=10

程式分析:

(1)在開頭處定義兩個指標變數*pointer_1,*pointer_2。但此時它們並未指向任何一個變數,只是提供兩個指標變數,規定它們可以指向整形變數,至於指向那個整形變數,要在程式中定義,程式中pointer_1指向a,pointer_2指向b,此時pointer_1的值就是&a,pointer_2的值就是&b。

(2)第8行輸出*pointer_1,*pointer_2的值,其中*是取值符號,表示“指向變數”。所以它們的值分別就是a,b變數的值。

(3)程式中有兩處*pointer_1,*pointer_2,第四行表示定義兩個指標*pointer_1,*pointer_2,“*”只是表示該變數是個指標變數。最後一行的printf函式中*pointer_1,*pointer_2代表指標變數*pointer_1,*pointer_2所指向的變數。