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! :)
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:
Dann sollte alles funktionieren. Beachten Sie, dass die gleiche Pointer-Semantik in C und Objective-C gilt.
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.
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.
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.
Tags und Links c objective-c pointers