C-Zeiger vs. Objective-C-Zeiger

7

Ich komme aus einem Objective-C-Hintergrund und versuche mein Wissen in C zu erweitern. Eine Sache hat mich jedoch verwirrt, und das ist der Unterschied zwischen Zeigern in C und Obj-C. Wie Sie in den folgenden Beispielen sehen können, scheinen sich die Dinge in beiden Sprachen ein wenig anders zu verhalten, und ich fragte mich, ob Sie vielleicht erklären könnten, warum?

C-Code funktioniert gut:

%Vor%

Obj-C-Code schlägt fehl:

%Vor%

Frage: Warum kann ich stringPointer nicht der Speicheradresse von string ( stringPointer = &string; ) zuweisen, und warum kann ich *pointerX = 5; unter C ausführen, kann aber nicht ausführen *stringPointer = @"Chocolate milkshake"; unter Objective-C?

Mir ist klar, dass Obj-C sich mit Objekten beschäftigt und C nicht, aber ich kann nicht die Details hinter den Kulissen herausfinden, warum es in Obj-C nicht funktioniert. Jede Hilfe wird sehr geschätzt. Vielen Dank! :)

    
Dave Gallagher 07.12.2009, 22:48
quelle

7 Antworten

18

In Ihrem ersten Beispiel haben x und pointerX unterschiedliche Typen ( (int) bzw. (int *) ). In Ihrem zweiten Beispiel haben string und stringPointer den gleichen Typ ( NSString * ). Versuchen Sie stattdessen:

%Vor%     
caf 07.12.2009, 22:52
quelle
10

Ihr NSString *string ist selbst ein Zeiger. Um darauf zu verweisen, müssen Sie stringPointer als Zeiger auf einen Zeiger deklarieren. Das heißt, stringPointer wie folgt deklarieren:

%Vor%

Dann sollte alles funktionieren. Beachten Sie, dass die gleiche Pointer-Semantik in C und Objective-C gilt.

    
E.M. 07.12.2009 22:53
quelle
5

Die Sache ist, dass wenn Sie ein Objekt erstellen, Sie es tatsächlich immer durch einen ihm zugewiesenen Zeiger manipulieren, daher (NSString *).

Versuchen Sie dasselbe in C zu tun (mit einer Zeichenkette zu arbeiten), vielleicht wird es klarer:

%Vor%

Wie Sie sehen, funktionieren Zeiger genau so wie in Ziel-c. Bedenken Sie, dass es in objective-c nur sehr wenige Primitive gibt (int ist die offensichtlichste). In den meisten Fällen erstellen Sie einen Zeiger vom Typ Objekt X (zB NSString), und dann ein Stück Speicher zuweisen (durch [[Object Alloc] Init]) und ordnen Sie die Startadresse dieses Chunks zu Ihrem Zeiger. Genauso wie wir es in C mit unserem String gemacht haben.

    
theprole 14.12.2009 09:41
quelle
3

&string hat den Typ NSString ** , während stringPointer den Typ NSString * hat, also die Warnung. Dann versuchen Sie, eine Instanz von NSString (mit dem Typ NSString * ) einer Variablen vom Typ NSString zuzuweisen, also dem Fehler.

    
swegi 07.12.2009 22:52
quelle
2

Es ist immer eine gute Idee, jede Variable in einer eigenen Zeile zu definieren. Das, wenn Sie Ihr ursprüngliches Ziel-с-Code wie

umschreiben %Vor%

viele Dinge werden klar.

    
Wildcat 07.12.2009 22:56
quelle
1

Die Frage ist - sind Ihre Strings const oder nicht?
Das erste Beispiel würde wahrscheinlich funktionieren.
Selbst in nicht-objektiven C-Compilern können literale Strings über Linker / Compiler-Optionen in const-Speicher abgelegt werden.

In dieser Zeile: stringPointer = & amp; string; Sie kopieren die Adresse des Zeigers in den String Poitner. Offensichtlich unvereinbar.

Und auf dieser Linie:
* stringPointer = @ "Schokoladenmilchshake";

Sie versuchen, eine Zeichenfolge in den Zeiger zu schreiben (der Zeiger ist eine 4-Byte-Adresse). Keine gute Idee, eine ganze Zeichenfolge oben drauf zu kopieren.

    
Matthias Wandel 07.12.2009 22:57
quelle
0

Was versuchst du zu tun?

Nicht sicher, ob es wie gewünscht funktioniert.

Sie scheinen Konzepte aus C zu nehmen und auf Cocoa-Klassen anzuwenden. Ich dachte, Sie lernten C. Haben Sie irgendwo im Objective-C-Code die Adresse eines Objekts gesehen?

Cocoa-Klassen werden mit Class clusters implementiert, was bedeutet, dass sie dieselbe Schnittstelle teilen, aber Sie erhalten eine spezifische erweiterte Klasse, die Sie manipulieren.

In Ihrem Fall nehmen Sie die Adresse einer möglichen Klasse, die NSString erweitert und weisen Sie sie dem Zeiger auf NSString zu.

Beispiel:

%Vor%

Ausgabe (GNUStep linux):

%Vor%

... abgesehen von den offensichtlichen Problemen der Zeigerdefinition, auf die andere hingewiesen haben.

    
stefanB 07.12.2009 23:59
quelle

Tags und Links