(* exptr)-> cnt是否与exptr-> cnt或(* exptr).cnt相同?

时间:2019-02-07 23:39:12

标签: c pointers

(*pointer)->namepointer->name(*pointer).name相同吗?

2 个答案:

答案 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