使用*代替->;c中的运算符

使用*代替->;c中的运算符,c,pointers,linked-list,syntax-error,C,Pointers,Linked List,Syntax Error,我用C语言创建了一个非常简单的链表程序 #include<stdio.h> #include<stdlib.h> int main(){ struct Int{ int num; struct Int *ptr; }; typedef struct Int NODE; NODE *start; start = (NODE *) malloc(sizeof(NODE)); (*start).n

我用C语言创建了一个非常简单的链表程序

#include<stdio.h>
#include<stdlib.h>

int main(){
    struct Int{
        int num;
        struct Int *ptr;
    };
    typedef struct Int NODE;
    NODE *start;
    start = (NODE *) malloc(sizeof(NODE));
    (*start).num = 100;
    (*start).ptr = (NODE *) malloc(sizeof(NODE));

    (*start).(*ptr).num = 123;
    (*start).(*ptr).ptr = NULL;

}
错误解决了

问题是为什么我不能使用
(*start)。
而不是
start->
。根据这个答案
这两行都是一样的。

最后两行应该写为:

(*(*start).ptr).num = 123;
(*(*start).ptr).ptr = NULL;

由于
(*ptr)
不是
(*start)
的成员,因此您应该访问
ptr
,然后取消对整个表达式的引用。

*ptr
不是
结构Int
的成员-
ptr
是,因此您不能在
运算符之后添加
*ptr

如果必须使用
*
并取消引用指针,则需要将整个
(*strart).ptr
表达式视为指针:

(*(*start).ptr).num = 123;
(*(*start).ptr).ptr = NULL;
N3337 5.2.5/1,2

后接一个点的FIX表达式。或箭头->,可选择后跟关键字模板(14.2), 然后是一个id表达式,后面是一个post fix表达式。[…]

无论哪种情况, id表达式应命名类或其基类之一的成员。[…]

所以dot后面必须跟有类成员的名称。你甚至不会写:

A a;
a.(some_member);//note the parentheses

因为dot后面必须跟有成员名。在问题中加入“错误”是什么会很有帮助。哪个错误,你的代码中没有编译器错误。
A a;
a.(some_member);//note the parentheses