我已声明的结构“节点”具有一个成员变量的“m”,然后访问结构限定两个变量如下使用指针
struct node t, *p;
在程序后来我分配的t
地址p
:
p = &t;
要访问成员变量我需要使用p->m
。
但我想使用*
算子,但是编写它*p.m
会给出错误。为什么这样?
我已声明的结构“节点”具有一个成员变量的“m”,然后访问结构限定两个变量如下使用指针
struct node t, *p;
在程序后来我分配的t
地址p
:
p = &t;
要访问成员变量我需要使用p->m
。
但我想使用*
算子,但是编写它*p.m
会给出错误。为什么这样?
为此,你必须看到运营商的优先权。
运算符.
的优先级高于*
运算符。
写它像*p.m
使编译器认为它是*(p.m)
。您需要使用(*p).m
。
由于运算符优先级,*p.memberVariable
将不起作用。做(*p).memberVariable
或p->memberVariable
这是因为operator precedence。
表达式*p.memberVariable
等于*(p.memberVariable)
。即它试图取消p.memberVariable
作为指针,而不是p
。这会给你一个编译器错误,因为p
是一个指向结构的指针,你可以使用点运算符来选择结构成员。
您需要明确告诉编译器使用括号取消引用指针p
:(*p).memberVariable
。
嗯...什么是'a'? –
使用'(* p).memberVariable'。 '.'优先级为1,'*'优先级为3. http://en.cppreference.com/w/c/language/operator_precedence – Arkadiy
请问您可以告诉我们*为什么要使用解引用操作符?使用它你会在每次你写的时候再写两个字符,对于代码读者来说可能并不那么清楚。 –