Zeiger verstehen
-
Hallo Allerseits!
Da ich noch ein Neuling in Sachen CPP bin, beschloss ich, das Kapitel "Zeiger" in Volkard's CPP-Kurs durchzulesen. Eine Aufgabe davon war, ein Programm zu kommentieren, welches mit Zeigern arbeitet:
#include <iostream> using std::cout; using std::endl; int main() { int a=5;// a wird 5 zugewiesen cout<<a<<endl;// ausgabe: 5 int *pa=&a;// zeiger *pa initialisieren und adresse von a an *pa zuweisen *pa=6;// wert vom zeiger *pa (also a) in 6 ändern cout<<a<<endl;// ausgabe: 6, weil der wert von a in der vorherigen anweisung von 5 auf 6 geändert wurde a=7;// a wird 7 zugewiesen cout<<*pa<<endl;// wert vom zeiger *pa auslesen. ausgabe: 7 int b=8;// b wird 8 zugewiesen int *pb=pa;// zeiger *pb initialisieren und wert (adresse) vom zeiger *pa, welcher wiederum die adresse der variablen a ist, an *pb zuweisen cout<<*pb<<endl;// ausgabe: 7 int **ppa=&pa;// adresse des zeigers *pa dem "zeiger auf zeiger" **ppa zuweisen cout <<**ppa<<endl;// ausgabe: 7, weil hier 2 verweisoperatoren verwendet werden, wird der wert von a ausgegeben. *ppa wäre hier gleich &a bzw. pa ppa=&pb;// adresse vom zeiger *pb dem "zeiger auf zeiger" **ppa zuweisen cout<<**ppa<<endl;// ausgabe: 7, weil hier 2 verweisoperatoren verwendet werden, // wird der wert von a ausgegeben. einziger unterschied zur vorletzten anweisung: *ppa wäre hier gleich &a bzw. >>pb<< pb=&b;// pb zeigt jetzt auf b(8) cout<<**ppa<<endl;// dadurch, dass die adresse vom zeiger *pb an den "zeiger auf zeiger" // **ppa übergeben wurde und pb danach die adresse von b(8) zugewiesen bekam, wird 8 ausgegeben std::cin.get(); }Nun meine Frage: Habe ich da etwas falsch verstanden?
Bedanke mich für jedwede Hilfe im Voraus.
-
Es sieht richtig aus. Du hast nur eine komische Art Zeiger zu benennen.
int a = 2; int *pa = &a; // [i]*pa[/i] ist [i]kein[/i] Zeiger, [i]pa[/i] ist ein ZeigerIn der zweiten Zeile wird pa initialisiert, nicht *pa. In der Hnisicht ist die Syntax einer solchen Initialisierung leicht inkonsistent. Die linke Seite sagt: "*pa ist ein int", die rechte Seite bezieht sich aber nur auf pa.
Gruß,
SP
-
Sebastian Pizer schrieb:
int *pa = &a; // [i]*pa[/i] ist [i]kein[/i] Zeiger, [i]pa[/i] ist ein ZeigerIn der zweiten Zeile wird pa initialisiert, nicht *pa. In der Hnisicht ist die Syntax einer solchen Initialisierung leicht inkonsistent. Die linke Seite sagt: "*pa ist ein int"
Ich würde sagen: Die linke Seite sagt:
"pa ist ein int*" - und dann ist es auch wieder konsistent. 'pa' ist ja der Bezeichner, der angelegt und initialisiert ist, nicht '*pa'.
-
@ Belli: In seinem Code steht aber
int *pa=&a;// zeiger *pa initialisieren und adresse von a an *pa zuweisenWas nicht stimmt. Weder ist
*paein Zeiger, noch wird die Adresse an*pazugewiesen.Ich halte übrigens auch nicht viel davon, den Stern an den Bezeichner zu hängen, weil er für mich zum Typ gehört. Und gerade vorweg, Zeiger-Mehrfachdeklarationen habe ich nie, sodass das für mich kein Problem darstellt.