C/C++ Pointer erklärt?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Pointer sind nichts anderes, als Variablen, die Speicheradressen von anderen Daten halten, daher auch die Bezeichnung Pointer. Er verweist/zeigt auf die eigentlichen Daten.

Er gehört damit zu den Referenztypen.

Wozu ist das gut?

Normale Variablen werden auf dem Stack verwaltet, der in der Regel eine beschränkte Größe hat. Brauche ich große Datenmengen, dann allokiere ich Speicher vom Heap, bekomme die Adresse (also einen Pointer) zurück und kann dann damit arbeiten.

In vielen Datenstrukturen gibt es eine Form von Referenz, z.B. zwischen den Knoten eines Baumes. Pointer übernehmen dabei diese Aufgabe. während man den Speicher für den jeweiligen Knoten dynamisch allokiert.

Um nochmal zum Stack zurückzukommen, Variablen haben ein Gültigkeitsbereich. Wenn wir von static storage absehen, sind die lokalen Variablen auch nur innerhalb z.B. einer Funktion gültig. Vom Heap allokierter Speicher ist dauerhaft bis Du ihn explizit freigibst.

Pointer sind eine Möglichkeit Generics umzusetzen, für ein typische Beispiel kannst Du Dir qsort aus der Standardbibliothek anschauen.

---------

Wie dem auch sei, so alt 'K&R - The C Programming Language' ist, das Kapitel über Pointer und Pointerarithmetik ist (in Originalsprache) allemal lesenswert.

Pointer ersparen dir unnötige duplikate von Werten. Wenn du bspw. eine Funktion hast und die Variable übergibst als Parameter, dann möchtest du nicht unbedingt die Variable 1 zu 1 nochmal im Speicher haben, sondern einfach nur auf diese Hinweisen (Zeigen).

Gestern hat kam auch ein Video raus über Pointer von einem Kanal, den ich gerne gucke: https://www.youtube.com/watch?v=IrGjyfBC-u0

subnout334 
Fragesteller
 05.06.2023, 17:58

Danke für die schnelle Antwort, ich schau mir das Video Mal an, schönem Tag noch!

0
BossWither  11.06.2023, 14:52

Gut, dass ich (ein C++ Programmierer) sie jetzt auch mal gecheckt habe. (Ich habe Pointer noch nie benutzt xD)

0

Jeder Wert muss irgendwo stehen, wenn Du in einem Progamm sowas hast wie a=1, dann steht irgendwo im Speicher eine 1 und das a ist ein Pointer auf diesen Speicherbereich.
Wenn Du jetzt mit diesem Inhalt von a in irgendeiner Funktion was machen möchtest, dann kannst Du ihr das mitgeben: foo(a) // ruft funtion foo mit Parameter 1 auf.

Die Funktion erhält 1, weil a hier bereits ausgewertet wird. Du kannst jetzt natürlich die Funktion etwas zurückgeben lassen mit return, wenn du aber das a direkt verändern möchtest, und nicht nur den Wert weiterverarbeiten, braucht es eine Möglichkeit, der Funktion zu sagen, sie soll keine Kopie, sondern die Speicherstelle von a bekommen. Du stellst also mit "Pointern" den Zustand wieder her, den höherlevelige Sprachen (C etc) vor Dir verbergen:

Sie machten aus Pointern (Zeiger auf Speicherbereiche) Variablen, und gaben Dir ihre Pointer, um um diese Regel herumzukommen.

Woher ich das weiß:Studium / Ausbildung – MCIPT:EA MCITP:SA

Pointer sind für verschiedene Datenstrukturen nützlich.

Beispiel: ein Array kann nur eine bestimmte Anzahl an Elementen aufnehmen, die auch noch alle die gleiche Größe haben müssen. Was machst du aber, wenn du vorher nicht weiß, wieviele Elemente du haben wirst oder wenn sie unterschiedlich groß sind - z.B. wenn du eine Textdatei zeilenweise einlesen willst. Du weißt nicht, wieviele Zeilen in der Datei sind und jede Zeile ist verschieden lang.

Du könntest jetzt einen Speicherbereich reservieren, der alles aufnehmen kann (Dateigröße + ein paar Byte für die Pointer). Entweder baust du nun eine verkettete Liste: <Pointer auf 2. Zeile><Inhalt 1. Zeile><Pointer auf 3. Zeile><Inhalt 2. Zeile> ... usw. So kannst du eine Schleife über alle Zeilen machen, indem du jeweils den Beginn der nächsten Zeile aus dem aktuellen Pointer ausliest.

Oder du baust das getrennt auf: eine Liste mit den Pointern (haben alle die gleiche größe btw!), die auf die eigentlichen Daten zeigen. Die Handhabung der Pointerliste ist ggf. einfacher und/oder flexibler, als ständig mit den ganzen Daten zu hantieren.

Und dann stell dir komplizierte Datenstrukturen vor, wie z.B. Bäume - wo ein Element auf mehrere andere mittels Pointer zeigen kann.