2009-02-24 29 views
21

Es cierto, que el Asterisk siempre significa "¡Oye, eso es un puntero!" ¿Y un puntero siempre tiene una dirección de memoria?¿Qué significa Asterisk * en Objective-C?

(Sí que sé con la excepción de que un * se utiliza para la operación matemática)

Por ejemplo:

NSString* myString; 

o

SomeClass* thatClass; 

o

(*somePointerToAStruct).myStructComponent = 5; 

Siento que hay más yo Necesito saber sobre el Asterirsk (*) que el que uso cuando defino una variable que es un puntero a una clase.

Porque a veces ya digo en la declaración de un parámetro que la variable Parameter es un puntero, y aún tengo que usar el Asterisk delante de la Variable para acceder al valor. Esto sucedió recientemente después de querer pasar un puntero de una estructura a un método de una manera como [myObj myMethod: & myStruct], no pude acceder a un valor de componente desde esa estructura aunque mi declaración de método ya decía que hay un parámetro (DemoStruct *) myVar que de hecho ya debería conocerse como un puntero a esa demostración, aún así siempre tuve que decir: "Hombre, compilador. Escucha! I IISS un puntero:" y escribe: (* myVar) .myStructComponentX = 5;

Realmente, realmente no entiendo por qué tengo que decir eso dos veces. Y solo en este caso.

Cuando uso el Asterisk en el contexto de un NSString * myString, entonces puedo acceder a myString de la forma que prefiera, sin decirle al compilador cada vez que es un puntero. es decir, me gusta usar * myString = @ "yep".

Simplemente no tiene sentido para mí.

+0

Esto es en realidad una pregunta C, ya que no es específico de Objective-C :) –

+0

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

+1

qué es específico de Objective- C es la notación @ "..." para un objeto de cadena. En Cocoa, la clase de tales objetos de cadena es NSString. – mouviciel

Respuesta

24

an * es en realidad un operador para desviar un puntero. La única vez que significa "hey soy un puntero" es durante la declaración de variables.

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

No significa nada diferente durante la declaración - 'Foo * foo' es en realidad' Foo * foo', como en, "' * foo' es un 'Foo'". Es totalmente consistente. – andyvn22

+0

¿Importa dónde coloque el asterisco durante la declaración? ¿Cuál es la buena práctica? (es decir, 'Foo * foo' y' Foo * foo') –

4

mmattax cubrió la distinción entre declaración (como puntero) y eliminación de referencias.

Sin embargo, en cuanto a lo que dice sobre: ​​


    (*myVar).myStructComponentX = 5; 

para acceder a un miembro de una instancia de una estructura C (ya que es) que puede hacer lo que hizo, o más comúnmente se utiliza la notación -> :


    myVar->myStructComponentX = 5; 

Objective-C es un poco confuso aquí porque recientemente (en ObjC 2.0) introducido sintaxis de la propiedad, que es un atajo para:


    int val = [myObject someIntProperty]; 

y ahora se puede escribir como:


    int val = myObject.someIntProperty; 

Ésta es Objective C (2,0) sintaxis para acceder a una propiedad que se ha declarado (no una variable miembro real), mientras que su ejemplo fue acceder a un miembro de una estructura C.

Asegúrese de tener en claro la diferencia.