2016-06-04 8 views
-1

habe ich ein sehr einfaches Programm von verknüpften Listen in C.Mit * statt -> Operator in 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; 

} 

Als ich ersetzen die letzten beiden Zeilen wie: -

start -> ptr -> num = 123; 
start -> ptr -> ptr = NULL; 

Der Fehler gelöst.

Die Frage ist, warum ich nicht (* start). statt start -> .Nach zu dieser Antwort What does this mean "->"? beide sind gleiche verwenden können.

+5

Weil Punkt gefolgt werden muss von * Mitgliedsname *. – PcAF

+0

Es wäre hilfreich, in die Frage einzubeziehen, was der "Fehler" ist. –

+0

** Welcher ** Fehler, Sie hatten nicht den Compilerfehler in Ihrem Code. –

Antwort

11

sollten Sie die letzten beiden Zeilen wie schreiben:

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

weil (*ptr) ist kein Mitglied von (*start), sollten Sie ptr dann dereferenzieren den gesamten Ausdruck zuzugreifen.

4

*ptr ist kein Mitglied von struct Int-ptr ist, so dass Sie nicht *ptr nach dem . Betreiber haben können.

Wenn Sie unbedingt * und dereferenzieren Ihre Zeiger verwenden müssen, müssen Sie die gesamte (*strart).ptr Ausdruck als Zeiger behandeln:

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

N3337 5.2.5/1,2

A post fi x Ausdruck gefolgt von einem Punkt. oder ein Pfeil. ->, optional durch das Schlüsselwort Vorlage gefolgt (14.2), und dann gefolgt von einer id-expression, ist ein Post fi x expression [...]

In jedem Fall wird die ID- Ausdruck ist ein Mitglied der Klasse nennen oder eines seiner Basisklassen. [...]

So Punkt hat nach Name des Klassenmitglied folgen. Sie können nicht einmal schreiben:

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