让我们说一个名为Point的结构,包含x,y和next;我何时撰写P.y
和何时P -> next
因为此代码:
typedef struct
{
int x, y;
struct Point *next;
} Point;
我无法使用P -> next
,也无法尝试if (P == NULL)
。
P.x
和P -> next
吗?答案 0 :(得分:3)
如果P
的类型为Point
,那么您始终使用.
。
Point p;
p.next;
如果P
的类型为Point*
,那么您始终使用->
。
Point* p
p->next;
如果你真的想在后一种情况下使用.
,你必须先尊重。
Point *p;
(*p).next;
仅在后一种情况下,检查p == NULL
是有意义的,因为指针可以是NULL
,但结构通常不是。{/ p>
由于next
本身被声明为指针,因此您应该使用->
跟随指向其下一个指针的指针。
Point p;
p.next->next; // Will only work if p.next is NOT NULL.
Point* p;
p->next->next; // Will only work if p->next is NOT NULL.
更新:要删除警告,请将声明更改为以下内容。
typedef struct Point
{
int x, y;
struct Point *next;
} Point;
问题是外部声明使用typedef
而不是struct
的标记,而内部使用struct Point
。有关您为何会出现此行为的详细信息,请参阅this question。
答案 1 :(得分:3)
当P->next
是指针类型P
时使用Point*
,当P.next
是Point
类型的实际结构时使用{{1}}。