Ho visto alcune risorse per dirmi come ->
e .
sono diversi, ma sembrano fare la stessa cosa. ->
si comporta come un operatore punto su una struttura?Come "->" e "." le operazioni di accesso membri differiscono in C
risposta
.
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
.
si sta utilizzando un punto quando si accede membri dell'oggetto, e la freccia -> quando si accede membri attraverso il puntatore ad un oggetto
->
è quello di un puntatore struct cosa .
è quello di una struttura.
struct Data data;
data.content = 1;
struct Data* pData = &data;
pData->content = 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);
}
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;
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;
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.
[.] 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.
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 è.
'->' 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
Mostra ciò che so di "C". Il "*" era un tipo -o. Grazie. –
- 1. ottimizzazione di accesso ai membri in C++
- 2. Come misurare le operazioni di base e primitive in C++?
- 3. come implementare le operazioni asincrone in C# e MVVM?
- 4. Modificatori di accesso sui membri dell'interfaccia in C#
- 5. clojure's -> (freccia) operatore e operazioni opzionali
- 6. In che modo memory_order_seq_cst e memory_order_acq_rel differiscono?
- 7. Perché Java e C# differiscono nell'opt?
- 8. membri privati di accesso PowerMock
- 9. C#: accesso ai membri di istanze private ereditate tramite Riflessione
- 10. Accesso membri privati da PowerShell
- 11. Accesso membri struct e array di struct da LLVM IR
- 12. Accesso ai membri aggregati in sottoclasse
- 13. Evidenzia membri e proprietà in Visual Studio
- 14. operazioni java bit >>> spostare
- 15. In che modo le chiusure differiscono tra foreach e list.ForEach()?
- 16. Come: default => 0 e: null => false differiscono per i campi integer nelle migrazioni?
- 17. Operazioni atomiche in C++
- 18. Le enumerazioni hanno un limite di membri in C#?
- 19. accesso ai membri di boost :: tupla
- 20. Quali sono le operazioni banali in std :: is_trivially_copy_constructible in C++
- 21. Python: accesso ai membri di un set
- 22. Le operazioni in virgola mobile sono associate in C?
- 23. Accesso membri protetti dalla funzione membro (statico) dei membri
- 24. Accesso ai membri privati di una superclasse
- 25. C++ mappa <string, vettore <char>> accesso
- 26. C++ 11; Le inizializzazioni di membri di dati non statici possono accedere ad altri membri dati?
- 27. Perché i tipi primitivi in C# hanno le proprie operazioni?
- 28. Rspec: come testare le operazioni di file e file contenuti
- 29. Perché definire membri privati sotto membri pubblici in C++?
- 30. Perché separare le operazioni di routing e controller in mojolicious?
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