Wozu genau benötigt man Pointer und Adressen?

2 Antworten

Ein Pointer ist (im Wesentlichen) eine Adresse, ob von einer Variablen oder einer Funktion.

Auf Maschinenebene kennt ein Computer nur Zahlen, also Adressen, und alle Namen müssen in Adressen übersetzt werden, ob Variablen oder Funktionen. Diese Übersetzung ist eine der Aufgaben eines Assemblers bzw. eines Compilers.

Beim Aufruf von Funktionen werden (normalerweise) die Funktionsargumente (Werte, die an die Funktion übergeben werden) auf den (Werte-)Stapel (Stack) geschoben, von der Funktion vom Stapel heruntergezogen, ausgewertet, und danach schiebt die Funktion den Rückgabewert wieder auf den Stapel.

Bei Werten, die wenig Speicherplatz benötigen, wie einzelne ganze Zahlen, braucht man hierfür nicht mehr Speicherplatz als bei Pointern auf die Werte. Bei Variablen, die viel Speicherplatz benötigen, wie Zeichenketten oder ganze Arrays, bräuchte man hierfür möglicherweise sehr viel Speicherplatz, und der Stack hat nur eine begrenzte Größe. Diesen Platz möchte man gerne sparen. Das ist der ursprüngliche Grund dafür, Pointer statt Werte an Funktionen zu übergeben.

Mit Pointer arbeitet die Funktion direkt auf den Werten statt auf einer Kopie. Wenn die Funktion also eins ihrer Argumente ändert, wirkt sich dies auch außerhalb der Funktion aus. Ursprünglich war das eine unerwünschte Nebenwirkung (eine Funktion war dazu gedacht, ausschließlich über ihren Rückgabewert Informationen zurückzugeben.)

Aber dann hat man sich gedacht, warum soll man diesen Nebeneffekt nicht bewusst nutzen? Auf diese Weise kann man z. B. eine Funktion schreiben, die ihre beiden Argumente vertauscht - dadurch lässt sich etwa die Schleife bei BubbleSort knapper und insbesondere klarer formulieren - vorher:

  variablentyp hilfswert = feld[i];
  feld[i] = feld[i+1];
  feld[i+1] = hilfswert,

nachher:

  vertausche(feld[i], feld[i+1]);

Dies ist vermutlich genau das, was du mit "funktionsübergreifend Speicher [...] übergeben" meinst.

Man kann aber auch Pointer auf andere Entitäten als Werte verwenden, insbesondere Pointer auf Funktionen - damit realisiert man "funktionswertige Variablen".

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Im Endeffekt, um einen Call-by-Reference umsetzen zu können. Pointer sidn letztlich eine Form von Referenzen, nicht zu verwechseln mit C++-Referenzen, die sind was anderes.

Ein Pointer ist eine Variable, die eine Speicheradresse (also Referenz auf den Speicher) hält.


user45453 
Beitragsersteller
 23.10.2019, 19:48

Also wenn eine Variable auf zum Beispiel Array[55] liegt kann man diesen Speicher wert dann nutzen

0