Objective-C - Zeiger - Referenzierung

Eli-

Mitglied
Hi, ich lerne gerade Objektive-C als Vorbereitung auf das iPhone-App Programmieren.

Aber ich verstehe nicht ganz, was die Zeiger bringen. z.B. int *i

Die zeigen ja auf den Speicherort der Variable. Aber woher weiß ich, wann ich einer Funktion den speicherort geben muss zum Werte eintragen(das mit &i), und wann nur die Variable? Das verstehe ich noch nicht ganz.
Ich glaube das hieß auch so Referenzierung oder so. Das erklärt das Buch, welches ich habe, nicht sonderlich gut, finde ich.

Danke schon mal

LG
Dennis
 
Hallo,

!Achtung! Ich kann hier nur von C und C++ sprechen, da ich mich mit Objective C nicht auskenne. Insofern können meine Aussagen im Folgenden teilweise nicht ganz zutreffen. Das Grundprinzip von Zeigern sollte aber (hoffentlich) klar werden.


Wie du richtig gesagt hast, zeigen Zeiger auf den Speicherort einer Variablen. Wie du sicherlich weißt, kann eine Funktion nur einen Rückgabewert zurückgeben. Was ist jetzt, wenn du mehr als einen Rückgabewert brauchst? Du könntest ein struct zurückgeben (unschön extra structs dafür zu definieren und aufwändig), oder aber mit Zeigern arbeiten, siehe folgendes Beispiel:

C++:
bool getRGB(DWORD color, int* r, int* g, int* b)
{
//do something
*r = ...
*g = ...
*b = ...

return true;
}

Dadurch, dass diese Funktion mit Zeigern arbeitet, werden die Speicherstellen direkt manipuliert, mit diesem Aufruf:
C++:
int r,g,b;
if(getRGB(&r,&g,&b))
{
//r,g,b haben jetzt die Werte aus der Funktion!
}


Ich hoffe, dass dir das verständlich geworden ist. Ansonsten frag gerne nach.

Aber Zeiger haben weitere Verwendungen, das war nur ein kleiner Anwendungsfall. Ein weiteres Beispiel: Du benötigst für verschiedene Gliederungsstrukturen Arrays von Objekten - denk zum Beispiel an ein Hauptmenü, da würde man dann zum Beispiel für jede Menüansicht ein Array mit den Elementen anlegen und zu dem ein Array mit den aktuellen Elementen haben wollen. Anstatt nun immer beim Fensterwechsel dessen Array in das Array mit den aktuellen Elementen zu kopieren, wäre es viel eleganter nur Zeiger zu kopieren. Warum? -->Geht schneller und verbraucht weniger Arbeitsspeicher, da Zeiger nur 4Bytes groß sind, egal worauf sie zeigen, zum Beispiel auch auf sehr komplexe structs.
Dasselbe gilt im übrigen auch bei Funktionsaufrufen: Wenn du Zeiger übergibst an Stelle von sehr großen Structs, dann ist es effizienter.

Zeiger werden auch benötigt für dynamische Arrays und zum Umgang mit Klassen.

Ein Wort zu dynamischen Arrays an dieser Stelle noch:
Was ist, wenn du beim Kompilieren noch nicht weißt, wie groß ein Array wohl werden wird? Klar, man könnte so ein Array mit einem so hohen Wert belegen, dass es wohl immer passt, also so etwas wie
C++:
int arr[10000];
Oder aber du könntest ein dynamisches Array anlegen mittels eines Zeigers:
C++:
int* pArr = new int[lines];
Der Vorteil hierbei ist dann wirklich, dass "lines" variabel sein kann und erst zu Laufzeit ausgewertet wird und somit spart man wieder Arbeitsspeicher.
Und so weiter und so fort. Ich weiß jetzt nicht in wie weit du das nachvollziehen konntest. Frag gerne nach. Oder informier dich bei Interesse noch über dynamische Arrays und verkettete Listen.


Ich hoffe, dass ich helfen konnte
lg
kickerxy
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück