取消引用指向結構的指標

假設我們有以下結構:

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 的內容的副本。改變 copymy_int 將不會改變它。

MY_STRUCT *ref = instance;
ref->my_int    = 2;

在這種情況下,ref 是對 instance 的引用。使用引用更改 my_int 將在 instance 中更改它。

通常的做法是使用指向結構的指標作為函式中的引數,而不是結構本身。如果結構很大,使用結構作為函式引數可能會導致堆疊溢位。使用指向結構的指標只會為指標使用足夠的堆疊空間,但如果函式更改傳遞給函式的結構,則會導致副作用。