2009-02-24 23 views
21

È vero, che l'asterisco significa sempre "Ehi, questo è un puntatore!" E un puntatore mantiene sempre un indirizzo di memoria?Che cosa significa Asterisco * in Objective-C?

(sì, lo so per l'eccezione che un * è utilizzato per il funzionamento di matematica)

Per esempio:

NSString* myString; 

o

SomeClass* thatClass; 

o

(*somePointerToAStruct).myStructComponent = 5; 

Sento che c'è più di me è necessario conoscere Asterirsk (*) di quello che uso quando si definisce una variabile che è un puntatore a una classe.

Perché talvolta nella dichiarazione di un parametro si dice che la variabile Parametro è un puntatore, e comunque devo utilizzare l'asterisco davanti alla variabile per accedere al valore. Ciò che è successo di recente dopo aver voluto passare un puntatore di una struct a un metodo in un modo come [myObj myMethod: & myStruct], non ho potuto accedere a un valore di un componente da quella struttura anche se la mia dichiarazione di metodo diceva già che esiste un parametro (DemoStruct *) myVar che in effetti dovrebbe essere già noto come un puntatore a quella dimostrazione, tuttavia dovevo sempre dire: "Man, compilatore, ascolta! È IIISSS un puntatore:" e scrivi: (* myVar) .myStructComponentX = 5;

Davvero davvero non capisco perché devo dirlo due volte. E solo in questo caso.

Quando uso l'asterisco nel contesto di un NSString * myString, posso accedere a myString come preferisco, senza dire al compilatore ogni volta che si tratta di un puntatore. ad esempio usando * myString = @ "yep".

Non ha senso per me.

+0

Questo è in realtà una domanda C in quanto non è specifico per Objective-C :) –

+0

duplicato di http://stackoverflow.com/questions/581657/why-do-i-have-to-write-mypointervar-only-sometimes-in-objective-c – philant

+1

cosa è specifico per Objective- C è la notazione @ "..." per un oggetto stringa. In Cocoa, la classe di tali oggetti stringa è NSString. – mouviciel

risposta

24

an * è in realtà un operatore per de-referenziare un puntatore. L'unica volta che significa "hey sono un puntatore" è durante la dichiarazione delle variabili.

Foo* foo // declare foo, a pointer to a Foo object 
&foo  // the memory address of foo 
*foo  // de-reference the pointer - gives the Foo object (value) 
+4

Non significa nulla di diverso durante la dichiarazione - 'Foo * foo' è in realtà 'Foo * foo', come in," '* foo' è un' Foo' ". È totalmente coerente. – andyvn22

+0

importa dove posizioni l'asterisco durante la dichiarazione? Qual è la buona pratica? (ad esempio 'Foo * foo' e' Foo * foo') –

0

Come ho detto nella my answer of your previous question, @"yep" è già un puntatore, quindi non c'è bisogno di * prima myString che è anche un puntatore. In questo caso, si assegnano puntatori e non valori.

4

mmattax copriva bene la distinzione tra dichiarazione (come puntatore) e dereferenziazione.

Tuttavia, come al punto su:


    (*myVar).myStructComponentX = 5; 

per accedere a un membro di un'istanza di una struct C (in quanto si tratta) si può fare quello che hai fatto, o più comunemente si utilizza la notazione -> :


    myVar->myStructComponentX = 5; 

Objective-C è un po 'confuso qui perché recentemente (in ObjC 2.0) ha introdotto proprietà Sintassi, che è una scorciatoia per:


    int val = [myObject someIntProperty]; 

e ora può essere scritta come:


    int val = myObject.someIntProperty; 

Questo è Objective C (2.0) sintassi per l'accesso a una proprietà che si hanno dichiarato (non una variabile membro effettiva), mentre il tuo esempio stava accedendo a un membro di una struct C.

Assicurati di essere chiaro sulla differenza.