文主要介紹一下C語言中的指針。
指針就是地址,而指針變數就是儲存地址的變數。
雖然用數表示地址,但是地址的取值範圍可能不同於整數的範圍,所以一定不能用普通整型變數儲存地址。
對指針變數的宣告與對普通變數的宣告基本一樣,唯一的不同就是必須在指針變數名字前放置星號:
int *p;
上述宣告說明p是指向int型別物件的指針變數。
取地址運算子:如果x是變數,那麼**&x**就是x在記憶體中的地址。
間接定址運算子:爲了獲得對指針所指向物件的存取,可以使用(間接定址)運算子。如果p是指針,那麼*p表示p當前指向的物件。
一旦指針變數指向了物件,就可以使用*(間接定址)運算子存取儲存在物件中的內容。
j = *&i; /* same as j = i; */
C語言允許使用賦值運算子進行指針的複製,前提是兩個指針具有相同的型別。
賦值語句*q = *p;是把p指向的值(i的值)複製到q指向的物件(變數j)中。
宣告相應的形式參數p爲指針。呼叫函數時,p的值爲&x,因此p(p指向的物件)將是x的別名。函數體內*p的每次出現都將是對x的間接參照,而且允許函數既可以讀取x也可以修改x。
void decompose(double x, long *int_part, double *frac_part)
{
*int_part = (long) x;
*fract_part = x - *int_part;
}
當呼叫函數並且把指向變數的指針作爲參數傳入時,通常會假設函數將修改變數,但是,僅需要檢查變數的值而不是改變它的值也是可能的。可以使用單詞const來表明函數不會改變指針參數所指向的物件。const應放置在形式參數的宣告中,後面緊跟着形式參數的型別說明:
void f(const int *p)
{
*p = 0; /*** WRONG ***/
}
這一用法表明p是指向「常整數」的指針。試圖改變*p是編譯器會檢查的一種錯誤。
永遠不要返回指向自動區域性變數的指針,一旦函數返回,區域性變數就不存在了,所以指向區域性變數的指針將是無效的。
微信公衆號 長夜西風
個人網站 http://www.cmder.info/