2016-06-03 6 views
-1

Es wird gesagt, dass * Operator in C bedeutet "Zeiger auf eine Variable" und folgenden Code ist legal:Warum kann * nicht gleichzeitig verwendet werden. ein Mitglied der Struktur besuchen?

#include <stdio.h> 
int main(){ 
    int a=5; 
    int *p=&a; 
    printf("%d\n", *p); 
    return 0; 
} 

Aber der folgende Code ist illegal:

#include<stdio.h> 

struct pair{ 
    int a,b; 
}; 

int main(){ 
    struct pair Alice, *Bob=&Alice; 
    Alice.a=1; 
    Alice.b=2; 
    printf("%d %d\n",*Bob.a,*Bob.b); 
    return 0; 
} 

Also, warum die * Operator funktioniert gut für Zeiger auf normale Variablen, funktioniert aber nicht für Zeiger auf Strukturen?

+6

Postfix '.' hat eine höhere Priorität als einstellige' * '. – EOF

+0

Dies ist wahrscheinlich, was Sie suchen http://stackoverflow.com/questions/1238613/what-is-the-difference-between-the-dot-operator-and-in-c –

+0

Es ist nicht, dass es nicht Arbeit, was du sagst, funktioniert, du bekommst nur den Vorrang des Betreibers falsch. – babon

Antwort

5

Da der Mitgliedszugriffsoperator . eine höhere Priorität hat als der Indirektionsoperator *.

Sie sollten Klammern verwenden, um auf das Element von dem zuzugreifen, auf das ohne Operator -> hingewiesen wird.

#include<stdio.h> 

struct pair{ 
    int a,b; 
}; 

int main(){ 
    struct pair Alice, *Bob=&Alice; 
    Alice.a=1; 
    Alice.b=2; 
    printf("%d %d\n",(*Bob).a,(*Bob).b); 
    return 0; 
} 
+0

Sie * müssen * Klammern verwenden, wenn Sie '->' nicht verwenden. Aber Sie sollten * den Operator '->' benutzen. –

+1

@KeithThompson: Sie vermeiden beide Klammern * und * '->' mit 'ptr [0] .member'. – EOF

+1

@EOF: Sie vermeiden Unklarheiten, indem Sie '->' verwenden. Gibt es einen Grund, warum das Vermeiden von '->' eine gute Sache ist? –

2

Aufgrund Vorrang von Operatoren, müssen Sie Ihre Variable klammern oder alternativ verwenden, um die -> Betreiber:

#include<stdio.h> 

struct pair { 
    int a, b; 
}; 

int main() 
{ 
    struct pair Alice, *Bob = &Alice; 
    Alice.a = 1; 
    Alice.b = 2; 
    printf("%d %d\n", (*Bob).a, (*Bob).b); 
    printf("%d %d\n", Bob->a, Bob->b); 
    return 0; 
} 
Verwandte Themen