指標變數及其定義,C語言指標變數定義詳解

2020-07-16 10:04:23
若有一個變數專門用來存放另一個變數的地址,那麼就稱它為“指標變數”。也就是說,指標變數裡面存放的是指標,即地址。

大家一定要區分“指標”和“指標變數”這兩個概念。指標是一個地址,而指標變數是存放地址的變數。

習慣上我們也將“指標變數”簡稱為“指標”,但大家心裡一定要明白這兩個指標的區別。一個是真正的指標,它的本質是地址;而另一個是指標變數的簡稱。

為了表示指標變數和它所指向的變數之間的聯絡,在程式中用“*”表示“指向”。如果定義變數 i 為指標變數,那麼 *i 就表示指標變數i裡面存放的地址所指向的儲存單元裡面的資料。

指標變數的定義

C 語言規定所有變數在使用前必須先定義,指定其型別,並按此分配記憶體單元。指標變數不同於整型變數和其他型別的變數,它是專門用來存放地址的,所以必須將它定義為“指標型別”。

指標變數定義的一般形式為:

基本類型 *指標變數名;

比如:
int *i;
float *j;
“*” 表示該變數的型別為指標型別。指標變數名為 i 和 j,而不是 *i 和 *j。

在定義指標變數時必須指定其基本類型。指標變數的“基本類型”用來指定該指標變數可以指向的變數的型別。比如“int*i;”表示 i 只可以指向 int 型變數;又比如“float*j;”表示 j 只可以指向 float 型變數。

換句話說,“基本類型”就表示指標變數裡面所存放的“變數的地址”所指向的變數可以是什麼型別的。說得簡單點就是:以“int*i;”為例,“*”表示這個變數是一個指標變數,而“int”表示這個變數只能存放 int 型變數的地址。

為什麼叫基本類型,而不直接叫型別?因為比如“int*i;”,其中 i 是變數名,i 變數的資料型別是“int*”型,即存放 int 變數地址的型別。“int”和“*”加起來才是變數i的型別,所以 int 稱為基本類型

“int*i;”表示定義了一個指標變數 i,它可以指向 int 型變數的地址。但此時並沒有給它初始化,即此時這個指標變數並未指向任何一個變數。此時的“*”只表示該變數是一個指標變數,至於具體指向哪一個變數要在程式中指定。這個就跟定義了“int j;”但並未給它賦初值一樣。

因為不同型別的資料在記憶體中所佔的位元組數是不同的,比如 int 型資料占 4 位元組,char 型資料占 1 位元組。而每個位元組都有一個地址,比如一個 int 型資料占 4 位元組,就有 4 個地址。那麼指標變數所指向的是這 4 個地址中的哪個地址呢?指向的是第一個地址,即指標變數裡面儲存的是它所指向的變數的第一個位元組的地址,即首地址。因為通過所指向變數的首地址和該變數的型別就能知道該變數的所有資訊。

指標變數也是變數,是變數就有地址,所以指標變數本身也是有地址的。只要定義了一個變數,程式在執行時系統就會為它分配記憶體空間。但指標變數又是存放地址的變數,所以這裡有兩個地址大家一定要弄清楚:一個是系統為指標變數分配的地址,即指標變數本身的地址;另一個是指標變數裡面存放的另一個變數的地址。這兩個地址一個是“指標變數的地址”,另一個是“指標變數的內容”。

地址也是可以進行運算的,我們後面會學到指標的運算和移動。比如“使指標向後移 1 個位置”或“使指標加 1”,這個 1 代表什麼呢?這個 1 與指標變數的基本類型是直接相關的。指標變數的基本類型佔幾位元組,這個 1 代表的就是幾。比如指標變數指向一個 int 型變數,那麼“使指標移動 1 個位置”就意味著移動 4 位元組,“使指標加 1”就意味著使地址加 4。所以必須指定指標變數所指向的變數的型別,即指標變數的基本類型。某種基本類型的指標變數只能存放該種基本類型變數的地址。

我們前面講過兩個指標變數相減的結果是一個常數,而不是指標型變數。如兩個“int*”型的指標變數相減,結果是 int 型常數。此時要是把相減的結果賦給“int*”型就會報錯。而且兩個指標變數相減的結果是這兩個地址之間元素的個數,而不是地址的個數。

比如說,兩個“int*”型的指標變數相減,第一個指標變數裡面存放的地址是 1245036,第二個指標變數裡面存放的地址是 1245032,那麼這兩個地址相減的結果是幾?是 1,而不是 4。因為 int 型變數占 4 位元組,所以一個 int 元素就佔 4 位元組,兩個地址之間相差 4 個地址,正好是一個 int 元素,所以結果就是 1。下面寫一個程式驗證一下:
# include <stdio.h>
int main (void)
{
    int *p, *q;
    int k;  //k用來存放兩個地址數相減的結果
    int i = 3, j = 4;
    p = &i;
    q = &j;
    k = p-q;
    printf("p = %dnq = %dnk = %dn", p, q, k);
    return 0;
}
輸出結果是:
p = 1245040
q = 1245036
k = 1