(*pointer)->name
与pointer->name
或(*pointer).name
相同吗?
答案 0 :(得分:9)
否。
(*pointer)->name
说:“得到pointer
指向的内容。获取它指向的结构并从中获取name
成员。”为此,pointer
必须是一个指向结构的指针。例如,可以将其声明为struct foo **pointer
。
pointer->name
说:“获取pointer
指向的结构并从中获取name
成员。”为此,pointer
必须是指向结构体。可以将其声明为struct foo *pointer
。
(*pointer).name
说:“获得pointer
指向的结构。从它那里获取name
成员。”它也必须是结构的pointer
。
(最后两个之间的唯一区别是,第二个在源代码中使用一个运算符。实际执行的操作是相同的。)
答案 1 :(得分:5)
在C中,a->b
运算符是(*a).b
的简写。
struct foo {
int b;
};
// the . operator is used when the struct object is NOT a pointer
struct foo a;
a.b = 42;
// the -> operator is used when the struct object IS a pointer
struct foo *a = malloc(sizeof *a);
a->b = 42;
// the same thing as the above example, but using the dot operator
(*a).b = 42;
最后一个示例是取消引用a
指针(获取其指向的对象),然后使用点运算符访问其中的元素b
。现在,让我们翻译您的问题。
// first one
(*a)->b;
// would be the same as:
(*(*a)).b;
// that is:
(**a).b;
// which would be used in
struct foo **a ... ;
(**a).b; // get the first element of the array, access field b
// second example
a->b;
// is the same as
(*a).b;
// which is your third example