2010-08-06 4 views

risposta

17

. viene utilizzato quando si dispone di una struttura, e -> viene utilizzato quando si dispone di un puntatore ad una struct. La freccia è una forma breve per il dereferenziamento del puntatore e quindi utilizzando .: p->field corrisponde a (*p).field.

+6

Vale la pena ricordare che questo è davvero bello quando si hanno puntatori a ** altre ** strutture in una struttura. Quindi hai 'a-> b-> c-> d' invece di' (* ((* ((a) .b)). C)). D'. – detly

2

si sta utilizzando un punto quando si accede membri dell'oggetto, e la freccia -> quando si accede membri attraverso il puntatore ad un oggetto

2

-> è quello di un puntatore struct cosa . è quello di una struttura.

struct Data data; 
data.content = 1; 

struct Data* pData = &data; 
pData->content = 2; 
2

Ah, ho appena trovato la stessa domanda, quando si guardavano le impostazioni locali. Uno è per l'accesso degli attributi attraverso il puntatore e uno è per la struct Dereferenced:

#include <locale.h> 

int main (void) { 

    struct lconv *locale_ptr; 
    locale_ptr = localeconv(); 
    printf("Currency symbol: %s\n", (*locale_ptr).currency_symbol); 
} 

è equivalente a:

int main (void) { 

    struct lconv *locale_ptr; 
    locale_ptr = localeconv(); 
    printf("Currency symbol: %s\n", locale_ptr->currency_symbol); 
} 
7

Sono quasi la stessa cosa. L'unica differenza è che "->" prende un puntatore a una struttura sul lato sinistro mentre "." prende una struct; "->" deferenze (ovvero segue) il puntatore prima di accedere al membro della struct. Così,

struct foo bar; 
bar.x = 0; 

è lo stesso:

struct foo bar; 
struct foo *diddly = &bar; 
diddly->x = 0; 
1

Più semplicemente si utilizza. quando si opera su una Struct stessa e -> quando si opera su un puntatore a una struttura.

Per mostrare in codice:

struct s myStruct; 
    myStruct.num = 5; 

è valida, ma:

struct s myStruct; 
    myStruct->num = 5; 

non è valido come myStruct non è un puntatore.

struct s *myStruct; 
    myStruct->num = 5; 

Sarebbe valido.

L'operatore -> è in realtà una scorciatoia per (* myStruct) .num;

1

Il linguaggio C, a differenza di molti altri linguaggi, consente alle variabili di avere oggetti (in questo caso struct) come valori e anche puntatori agli oggetti come valori. A seconda del tipo di variabile utilizzato, "." o "->" devono essere usati rispettivamente.

1

[.] opera su un oggetto di una struttura. Una volta dichiarato l'oggetto di una particolare struttura, l'operatore [.] Può essere utilizzato per operare direttamente con i membri.

[->] opera su un puntatore all'oggetto di una struttura. Questo è un operatore di dereferenza che viene utilizzato esclusivamente con puntatori agli oggetti con membri. Così permettendoci di accedere ai membri dell'oggetto a cui abbiamo un riferimento.

In base alla dichiarazione è possibile utilizzare questi operatori.

0

L'operatore a-> b, canonicamente, significa (* a) .b. Quindi, a differenza di ".", Sarà la dereferenziazione del suo primo argomento.

Potrei sbagliarmi su questo punto, ma capisco che non è "ufficialmente" parte di C (si cita in modo specifico C nella domanda). È un costrutto C++ che la maggior parte dei produttori di compilatori C ha aggiunto a C. Tuttavia, devo ammettere che non ho tenuto il passo con le modifiche a C, quindi potrei sbagliarmi completamente.

In C++ ci sono ulteriori differenze. L'operatore "->" è sovraccarico, dove come "." non è.

+4

'->' era nella prima edizione di K & R quindi è stato parte di C per la maggior parte della sua vita e sicuramente da prima che il C++ fosse un luccichio negli occhi di Bjarne Soustrup. Anche 'a-> b' è zucchero sintattico per' (* a) .b'. Nel tuo esempio le parentesi erano nel posto sbagliato. – JeremyP

+0

Mostra ciò che so di "C". Il "*" era un tipo -o. Grazie. –

Problemi correlati