取消引用指向结构的指针
假设我们有以下结构:
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
中更改它。
通常的做法是使用指向结构的指针作为函数中的参数,而不是结构本身。如果结构很大,使用结构作为函数参数可能会导致堆栈溢出。使用指向结构的指针只会为指针使用足够的堆栈空间,但如果函数更改传递给函数的结构,则会导致副作用。