取消引用指向结构的指针

假设我们有以下结构:

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 中更改它。

通常的做法是使用指向结构的指针作为函数中的参数,而不是结构本身。如果结构很大,使用结构作为函数参数可能会导致堆栈溢出。使用指向结构的指针只会为指针使用足够的堆栈空间,但如果函数更改传递给函数的结构,则会导致副作用。