Wofür verwendet man Pointer?

3 Antworten

ich kann das mal an einem handle festmachen was z.b. eine datenbankverbindung hält .

diese kann ich nicht einfach irgendwo hin kopieren , da der treiber etc auf diese speicherstelle schreibt .

deswegen ist bei sowas z.b. ein pointer sinnvoll , alle sachen arbeiten dann auf diese speicherstelle und müssen auch nur diese verwalten und koordinieren .

gibt noch viele andere gründe , aber das ist einer den man sich auch logisch vorstellen kann .


hilfebitte393 
Fragesteller
 21.07.2022, 17:13

Das macht Sinn, vielen Dank :)

0

Wenn man eine verkettete Liste von Objekten hätte, sind alle Elemente der Liste im Speicher, jedoch werden nicht alle in einer separate Variable gespeichert. Es gibt einen Pointer, der den Anfang zeigt und den Rest wird durch iteration erreicht..

Ein Pointer, egal auf welchen Typ er zeigt, hat immer die gleiche Größe. Ich kann also ein Array von Pointern nehmen, die auf Objekte unterschiedlicher Größe, die querfeldein auf dem Heap rumliegen, zeigen.

Jetzt kann ich das Array von Pointern nehmen und die Pointer so umordnen, daß ich danach die Objekte in sortierter Reihenfolge ausgeben kann. Auch könnte ich so ein Array für einen indizierten Zugriff nutzen. (Beispiel eine verkettete Liste, die die Objekte selbst mit Pointern verkettet, die um indizierten Zugriff ergänzt wird).

Auch gibt es Funktionspointer, nehmen wir mal ein Beispiel aus der Standardbibliothek von C:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));

Wie implementiere ich einen Quicksort ohne Typisierung, also generisch?

Ich lasse mir die Basisadresse des Speicherbereichs (Array) geben, die Zahl der Elemente (Länge des Arrays) und die Größe eines einzelnen Elementes. Ferner weiß ich nicht, wie ich die Objekte im Array vergleichen kann, also brauche ich einen Pointer auf eine (Vergleichs)Funktion (ich kann sie ja noch nicht schreiben), um sie aufzurufen und übergebe ihr zwei Pointer (Adressen der beiden Elemente des Arrays, die ich vergleichen möchte, denn ich weiß ja nichts über deren Typ).

int mycmp(const void *a, const void *b){
   return ((struct person *)a)->age - ((struct person *)b)->age;
}

So könnte die Vergleichsfunktion, die ich übergebe aussehen, sie erhält die Adresse zweier Objekte über deren Gestalt der Aufrufer nichts weiß und die Funktion kann dann entsprechend trotzdem den Vergleich durchführen.

C++ bietet mit Templates natürlich eien viel angenehmere Option für Generics.