2016-06-04 2 views
-1

Я создал очень простую программу связанных списков в С.Использование * вместо -> оператор с

#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 "->"? оба одинаковы.

+5

Потому что точка должна сопровождаться * именем члена *. – PcAF

+0

Было бы полезно включить в вопрос, что такое «ошибка». –

+0

** Какая ** ошибка, у вас не было ошибки компилятора в коде. –

ответ

11

вы должны написать две последние строки, как:

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

(*ptr) потому, что не является членом (*start), вы должны получить доступ к ptr затем разыменования всего выражения.

4

*ptr не является членом struct Int - ptr есть, так что вы не можете иметь *ptr после оператора ..

Если вы абсолютно необходимо использовать * и разыменования ваши указатели, вы должны рассматривать весь (*strart).ptr выражение как указатель:

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

N3337 5.2.5/1,2

A постфиксное выражение, за которым следует точка. или стрелка -.>, необязательно с последующим шаблоном ключевого слова (14.2), , а затем, за которым следует Ид выражения, является выражением пост фи х [...]

В любом случае, id- выражение должно назвать член класса или одного из его базовых классов. [...]

Так точка должен следовать имя члена класса. Вы не можете даже написать:

A a; 
a.(some_member);//note the parentheses 
Смежные вопросы