我在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 -> ptr -> num = 123;
start -> ptr -> ptr = NULL;
错误已解决。
问题是为什么我无法使用(* start).
代替start ->
。根据此答案 What does this mean "->"?
两者都是一样的。
答案 0 :(得分:11)
你应该把最后两行写成:
(*(*start).ptr).num = 123;
(*(*start).ptr).ptr = NULL;
因为(*ptr)
不是(*start)
的成员,您应该访问ptr
,然后取消引用整个表达式。
答案 1 :(得分:4)
*ptr
不是struct Int
- ptr
的成员,因此您无法跟*ptr
运营商.
。
如果您必须使用*
并取消引用指针,则需要将整个(*strart).ptr
表达式视为指针:
(*(*start).ptr).num = 123;
(*(*start).ptr).ptr = NULL;
答案 2 :(得分:1)
N3337 5.2.5 / 1,2
post fi x表达式后跟一个点。或箭头 - &gt;,可选地后跟关键字模板(14.2), 然后是 id-expression ,是一个post fi x表达式。[...]
无论哪种情况, id-expression应该命名类或其基类之一。[...]
所以 dot 必须跟着类成员的名字。你甚至不能写:
A a;
a.(some_member);//note the parentheses