c語言之指針基礎知識

將指針和普通變量進行比較,將有助於您理解指針。所謂“普通變量”就是存儲器中能夠保存數值的一個位置。例如,當您聲明變量i爲一個整數時,四個字節的存儲空間就爲它預留出來了。程序中用i表示那個預留出的位置。在機器的層面上看,這個位置具有一個內存地址。從這個地址開始的四個字節對您(程序員)來說就是變量i,它們可以保存一個整數。

c語言之指針基礎知識

C語言之指針基礎知識

指針就不同了。指針是指向另一個變量的變量。意思是一個指針保存的是另一個變量的內存地址。換句話說,指針保存的並不是普通意義上的數值,而是另一個變量的'地址值。一個指針保存了另一個變量的地址值,就說這個指針“指向”了那個變量。

因爲指針保存了地址而不是數值,所以它有兩個部分。指針本身保存一個地址,這個地址又指向一個數值,即:指針本身和被指向的數值兩部分。這個概念開始可能有些不好理解,而一旦掌握將是極有裨益的。

下面的例子顯示了一個典型的指針:

#include

int main()

{

int i,j;

int *p;

p=&i;

*p=5;

j=i;

printf("%d %d %d", i, j, *p);

return 0;

}

程序的第一行聲明瞭兩個普通的整型變量i和j。int *p這行聲明瞭一個名爲p的指針。它告訴編譯器,所聲明的變量p是一個指向整數的指針。*表示聲明的是指針而不是普通變量。您可以創建任何類型的指針:float,結構體,char等等。只要用*指出您要的是指針而非普通變量即可。

p=&i 這行您肯定還沒見過。C語言中, 這個表達式的意思就是“將i的地址賦值給p。”這條語句一經執行,p就“指向”了i。而此前p的內容是一個未知的隨機地址,直接使用的話很可能會導致程序錯誤或類似的程序崩潰。

畫圖是觀察程序運行過程的好方法。聲明i、j和p後,程序的狀態是這個樣子:

上圖中的三個變量i、j和p都被聲明過了,但還沒有初始化。所以將兩個整型變量以含有問號的方框表示——程序執行到這一步時它們的內容可以是任何值。將指針以圓圈表示,以區別於保存數值的一般變量,隨意的幾個箭頭表示它現在可能指向任何一個位置。

執行了p=&i這行後,p被初始化爲指向i,像這樣:

p指向i之後,i代表的內存位置就有了兩個名字。它除了叫做i,現在還叫做*p。這就是爲什麼說C中的指針變量有兩個部分:p是容納地址的位置,而*p是地址指向的位置。因此*p=5的意思是將p指向的位置的值設爲5,像這樣:

因爲*p和i代表同一位置,i的值自然也就變成了5。於是j=i;將j也設爲5,printf語句的輸出就是5 5 5。

指針的主要特性是它天生具有兩部分。指針本身除了保存地址,還指向某種類型的值,而這個值的地址正是指針保存的那個。在上面的例子中,指針本身是p,它指向的值是*p。