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

指針變量及其定義,C語言指針變量定義詳解

若有一個變量專門用來存放另一個變量的地址,那么就稱它為“指針變量”。也就是說,指針變量里面存放的是指針,即地址。

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

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

為了表示指針變量和它所指向的變量之間的聯系,在程序中用“*”表示“指向”。如果定義變量 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 = %d\nq = %d\nk = %d\n", p, q, k);
    return 0;
}
輸出結果是:
p = 1245040
q = 1245036
k = 1

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

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

底部Logo