Zeiger (Pointer)?

Erste Frage Aufrufe: 896     Aktiv: 07.05.2021 um 15:13

0

Zeiger. Vor allem in C sind sie ja ein oft genutztes Mittel und stehen auch charakterisierend für die Vorteile von C. Obwohl ich mich jetzt länger damit beschäftige, gibt es immer noch einige Unklarheiten.

Wenn mich z.B. jemand fragt, warum Zeiger denn nun so mächtig sind, kann ich weder eine flüssige, noch eine klare Antwort darauf abgeben.

Also, Pointer zeigen auf eine bestimmte Adresse im dynamischen Speicher und man kann mit ihnen viel Chaos anstellen - jemand verglich dies mal mit dem "Zauberstab" aus Harry Potter. Man kann gutes damit bewirken, aber auch viel Unheil anrichten. Wenn man z.B. mittels eines Pointers auf die Adresse einer deklarierten Variablen zeigt und diese ändert, bspw. durch ein Inkrement, dann ändert sich ja indirekt die Adresse dieser Variablen. Damit kann man dann z.B. auf Speicher zugreifen, den man normalerweise unangetastet lassen sollte. Stimmt das soweit? Kann man das ergänzen? Das ist doch nicht alles, oder? Weshalb sind Zeiger so ein mächtiger Werkzeug (in C)?

Diese Frage melden
gefragt

Punkte: 10

 
Kommentar schreiben
1 Antwort
1

Hallo mathwork, über Zeiger kann man wirklich ein ganzes Buch schreiben. Das was Du in Deiner Frage geschrieben hast soweit alles richtig. Lediglich den Part mit "mittels eines Pointers auf die Adresse einer deklarierten Variablen zeigt…" habe ich nicht ganz verstanden oder ist nicht ganz richtig. Ein Zeiger zeigt, wie der Name schon sagt, auf einen Speicherbereich. Dort (Speicherbereich) kann sich vieles verbergen. Variablen, Konstanten, Hardware Adressen der Mikrokontroller-Peripherie und Anderes. Auf all das kann man mittels Zeiger zugreifen und den Inhalt des Speichers verändern. Mit allen Risiken und Nebenwirkungen. Angenehm und daher sehr oft genutzt ist die Tatsache, dass nur die Speicheradresse und nicht der Inhalt des Speichers weitergegeben wird. Wenn Du in C einen Datensatz von 1000 Byte in ein Unterprogramm gibst wird der Compiler diese 1000 Byte auf den Stack des Programms legen. So werden eben Variablen übergeben. Speziell bei kleinen (embedded) Systemen hast Du aber diese 1000 Byte nicht. Hier hilft ein Zeiger. Es landet also nur der Zeiger, meist 4 Byte, auf dem Stack. Ein Zeiger kann und soll auch typisiert sein. Bedeutet, dass Du jederzeit einen Zeiger auf eine definierte Struktur (struct) haben kannst. Auch hier spart man Speicher bei der Parameterübergabe. Mit diesen Zeigern kannst Du Dir viel Arbeit ersparen. Angenommen Du bekommst über eine Schnittstelle, z.B. USB, einen Datenstrom ins Programm. Das ist dann meist ein Array of char. Wenn Du weißt, dass die empfangenen Daten einer Struktur entsprechen kannst du einen strukturierten Zeiger auf die Adresse der Daten legen und sofort hast Du Zugriff auf die einzelnen Elemente der Struktur ohne sie von A nach B kopieren zu müssen. (ZEIGER->TEST1 = xx;) Aber Achtung! Bei genau solchen Dingen passieren sehr schnell Fehler, wenn man nicht genau weiß was man tut. Was auch gern gemacht wird und auch immer wieder zu Probleme führt, ist das fortschalten strukturierter Zeiger. Machst Du bei einem strukturierten Zeiger ein ZEIGER++ schaltet er nicht um eine Adresse sondern um eine ganze Strukturgröße weiter. Daher können Zeiger auch wie ein Array behandelt werden. Befinden sich mehrere Strukturen hintereinander im Speicher kannst du, nachdem der Zeiger der Startadresse zugewiesen ist, z.B. mit ZEIGER[4] auf die 5te Struktur zugreifen. In C gehen Arrays immer bei 0 los. Sowas geht natürlich auch mit Array of char.

Ich könnte noch ein paar Stunden so weitermachen. Einfacher wäre es aber konkrete Fragen zu dem Thema zu besprechen. Wenn Dich konkrete Dinge interessieren einfach noch mal fragen.

Gruß jobe

Diese Antwort melden
geantwortet

Sonstiger Berufsstatus, Punkte: 505

 

Kommentar schreiben