取消引用指向結構的指標
假設我們有以下結構:
struct MY_STRUCT
{
int my_int;
float my_float;
};
我們可以定義 MY_STRUCT
來省略 struct
關鍵字,這樣我們就不必在每次使用時輸入 struct MY_STRUCT
。但是,這是可選的。
typedef struct MY_STRUCT MY_STRUCT;
如果我們有一個指向此結構的例項的指標
MY_STRUCT *instance;
如果此語句出現在檔案範圍內,則在程式啟動時將使用空指標初始化 instance
。如果此語句出現在函式內,則其值未定義。必須初始化變數以指向有效的 MY_STRUCT
變數,或者在可以取消引用之前指向動態分配的空間。例如:
MY_STRUCT info = { 1, 3.141593F };
MY_STRUCT *instance = &info;
當指標有效時,我們可以取消引用它以使用兩種不同的符號之一訪問其成員:
int a = (*instance).my_int;
float b = instance->my_float;
雖然這兩種方法都有效,但最好使用箭頭 ->
運算子而不是括號,dereference *
運算子和 dot .
運算子的組合,因為它更易於閱讀和理解,尤其是對於巢狀用法。
另一個重要的區別如下:
MY_STRUCT copy = *instance;
copy.my_int = 2;
在這種情況下,copy
包含 instance
的內容的副本。改變 copy
的 my_int
將不會改變它。
MY_STRUCT *ref = instance;
ref->my_int = 2;
在這種情況下,ref
是對 instance
的引用。使用引用更改 my_int
將在 instance
中更改它。
通常的做法是使用指向結構的指標作為函式中的引數,而不是結構本身。如果結構很大,使用結構作為函式引數可能會導致堆疊溢位。使用指向結構的指標只會為指標使用足夠的堆疊空間,但如果函式更改傳遞給函式的結構,則會導致副作用。