指標宣告
指標宣告會為指標變數命名,並指定變數所指向的物件類型。 宣告為指標的變數會保留記憶體位址。
語法
declarator
:
pointer
opt direct-declarator
direct-declarator
:
identifier
(
declarator
)
direct-declarator
[
constant-expression
opt ]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
opt )
pointer
:
*
type-qualifier-list
opt
*
type-qualifier-list
opt pointer
type-qualifier-list
:
type-qualifier
type-qualifier-list
type-qualifier
type-specifier
會為物件提供類型,它可以是任何基本、結構或等位類型。 指標變數也可以指向函式、陣列和其他指標 (如需宣告和解譯更複雜指標類型的詳細資訊,請參閱解譯更複雜的宣告子)。
您可以將 type-specifier
設為 void
,以藉此延後指定指標參考的類型。 這類項目稱為「void
的指標」,書寫方式為 void *
。 宣告為 void
指標的變數可用來指向任何類型的物件。 不過,若要在指標或指標所指向的物件上執行大部分作業,則必須為每項作業明確指定指標所指向的類型 (char *
類型和 void *
類型的變數可在不進行類型轉換的情況下與指派相容。)這類轉換可以使用類型轉換來完成。 如需詳細資訊,請參閱類型轉換。
type-qualifier
可以是 const
或 volatile
或兩者。 這些關鍵字會分別指定,指標不可由程式 (const
) 本身修改,或是指標可由非程式 (volatile
) 所控制的某個處理序合法修改。 如需 const
和 volatile
的詳細資訊,請參閱類型限定詞。
declarator
會為變數命名,並且可以包含類型修飾詞。 例如,如果 declarator
代表陣列,則指標的類型會修改為陣列的指標。
您可以在定義結構、等位或列舉類型之前,宣告結構、等位或列舉類型的指標。 使用結構或等位標記即可宣告指標,如範例所示。 由於編譯器不需要知道結構或等位的大小,也能為指標變數配置空間,因此允許使用這類宣告。
範例
下列範例將示範指標宣告。
char *message; /* Declares a pointer variable named message */
message
指標會指向 char
類型的變數。
int *pointers[10]; /* Declares an array of pointers */
pointers
陣列中有 10 個元素,每個元素都是 int
類型變數的指標。
int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */
pointer
變數會指向具有 10 個項目的陣列。 這個陣列中的每個元素都具有 int
類型。
int const *x; /* Declares a pointer variable, x,
to a constant value */
x
指標可以修改為指向不同的 int
值,不過它所指向的值無法修改。
const int some_object = 5 ;
int other_object = 37;
int *const y = &fixed_object;
int volatile *const z = &some_object;
int *const volatile w = &some_object;
這些宣告中的變數 y
會宣告為 int
值的常數指標。 它所指向的值可以修改,不過指標本身必須一律指向相同位置:fixed_object
的位址。 同樣地,z
是常數指標,不過它也會宣告為指向 int
,且程式不可修改其值。 volatile
指定名稱指出,雖然程式無法修改 z
所指向的 const int
值,但是該值可以由與程式同時執行的處理序合法修改。 w
的宣告會指定程式無法變更所指向的值,而且程式無法修改指標。
struct list *next, *previous; /* Uses the tag for list */
這個範例會宣告兩個指標變數 (next
和 previous
),這兩個變數會指向結構類型 list
。 只要 list
類型定義與宣告具有相同的可視性,這個宣告就可以在定義 list
結構類型之前出現 (請參閱下一個範例)。
struct list
{
char *token;
int count;
struct list *next;
} line;
變數 line
具有名為 list
的結構類型。 list
結構類型有三個成員:第一個成員是 char
值的指標,第二個是 int
值,而第三個是另一個 list
結構的指標。
struct id
{
unsigned int id_no;
struct name *pname;
} record;
變數 record
具有結構類型 id
。 pname
會宣告為另一個名為 name
之結構類型的指標。 這個宣告可以在定義 name
類型之前出現。