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

C語言指針的聲明

指針(pointer)是對數據對象或函數的一種引用。指針有多種用途,例如定義“傳址調用”函數,它還可以實現動態數據結構,例如鏈表和樹。

通常,管理大量數據的有效方法不是直接處理數據本身,而是使用指向數據的指針。例如,如果需要對大量的大型記錄進行排序,對指向該記錄的指針列表進行排序效率要比直接對記錄排序高得多,因為這樣無需在內存中移動數據。

類似地,如果需要把大型記錄傳入函數,傳遞指向該記錄的指針會比直接傳遞記錄本身更經濟,即使函數不需要修改該記錄。

指針代表了一個對象或函數的地址和類型。如果一個對象或函數具有 T 類型,那么指向它的指針就具有一個衍生出的指向 T 的指針類型(pointer to T)。例如,如果 var 是一個 float 變量,那么表達式 &var(其值是該 float 變量的地址)屬于指向 float 的指針類型,按照 C 語言表達,就是 float* 類型。

指向任何 T 類型的指針也被簡稱為 T 指針(T point)。因此,&var 中地址運算符會生成一個 float 指針。

因為 var 沒有在內存中移動位置,所以表達式 &var 是一個常量指針。然而,C 也允仵使用指針類型來定義變量。指針變量存儲的是另一個對象或函數的地址。我們后面會進一步討論指向數組和函數的指針。首先,看看如何聲明指向非數組對象的指針,語法如下:

類型 * [類型限定符列表] 名稱 [= 初始化器];


在聲明中,星號(*)表示“指向的指針”。標識符“名稱”被聲明為一個對象,其對象類型為“類型”,也就是“指向‘類型’的指針”。類型限定符為可選擇項,可能包含 const、volatile 和 restrict 的任意組合。

下面是一個簡單的例子:
int *iPtr;                           // 聲明iPtr作為一個指向int的指針

int 類型是 iPtr 指針所指向的對象的類型。為了讓指針能夠引用到給定的對象,將該對象的地址賦值給該指針。例如,如果 iVar 是一個 int 變量,那么下面的賦值操作會讓 iPtr 指向變量 iVar:
iPtr = &iVar;                         // 使得iPtr指向變量iVar

一般形式的聲明包含了用逗號分隔開的聲明符列表,每個聲明符聲明了各自的標識符。在指針聲明中,星號(*)是聲明符的一部分。我們可以在一個聲明中同時定義和初始化變量 iVar 和 iPtr,如下所示:
int iVar = 77, *iPtr = &iVar;  // 定義一個int變量,以及一個指向它的指針

這兩個聲明中的第二個聲明,將 iPtr 初始化為變量 iVar 的地址,這使得 iPtr 指向 iVar。圖 1 展示了變量 ivar 和 iPtr 在內存中可能的排列方式。這里的地址為示例所需,純粹是虛構的。如圖 1 所示,存儲在指針 iPtr 中的值是對象 iVar 的地址。


圖 1

在驗證與調試時,輸出地址常常有助于判斷。函數 printf()提供了一種格式化修飾符:%p。下面語句輸出變量 iPtr 的地址和內容:
printf("Value of iPtr (i.e. the address of iVar):       %p\n"
      "Address of iPtr:                                 %p\n", iPtr, &iPtr);

無論指針所指對象的類型是什么,在內存中指針空間的大小(例如,表達式 sizeof(iPtr))都是一樣的。換句話說,char 指針所占用的空間和指向大型結構的指針所占用的空間一樣。在 32 位計算機上,指針通常是 4 個字節長。

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

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

底部Logo