使用*代替->;c中的运算符
我用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
#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