Forum: PC-Programmierung c++: verstehe Zeiger-Konzept nicht


von ccccc++ (Gast)


Lesenswert?

Folgender Code macht mein Verständnisproblem deutlich:
1
#include <iostream>
2
#include <conio.h>
3
4
using namespace std;
5
6
int main(void)
7
{
8
    int a;
9
    
10
    /*
11
     _Speicherzellen_______________ _____________
12
     |  [1]  |  [2] |  [3] |  [4] |  [5]  |  [6] |
13
     |  127  |  42  |   7  | 1024 | 31415 | 1337 |
14
     |_______|______|______|______|_______|______|
15
    */
16
    
17
    //Adresse ausgeben
18
    cout << "Adresse von a: " << &a << endl;
19
    
20
    //Datentyp, der Adressen speichert: Zeiger (Pointer)
21
    int *zeigerAufA = &a;
22
    
23
    cout << "Fuer die erste Methode 1 eingeben\n"
24
         << "Fuer die zweite Methode 2 eingeben\n";
25
         
26
    char eingabe;
27
    do {
28
        eingabe = getch();//Buchstabe von Tastatur abfangen (ohne ENTER)
29
        
30
        if(eingabe == '1') {
31
            a = 7;
32
            cout << "a = " << a << endl;
33
        } else if (eingabe == '2') {
34
            *zeigerAufA = 42;
35
            //*zeigerAufA = &a;
36
            cout << "a = " << a << endl << endl;
37
            cout << "zeigerAufA = " << zeigerAufA << endl;//zeigerAufA (ADRESSE)
38
            cout << "*zeigerAufA = " << *zeigerAufA << endl;//*zeigerAufA (WERT)
39
        } else {
40
            return 0;
41
        }
42
        
43
    } while((eingabe == '1') || (eingabe == '2'));
44
    
45
    return 0;
46
47
}
Oben im Programm wird "*zeigerAufA" eine Adresse nämlich "&a" 
zugewiesen. Weiter unten wird demselben Objekt eine Zahl und zwar "42" 
zugewiesen.
1
1) *zeigerAufA = &a;
2
2) *zeigerAufA = 42;
Wenn ich im Programmtext unter "*zeigerAufA = 42;" nochmals das 
auskommentierte "*zeigerAufA = &a;" einfüge, läuft dieses beim ersten 
Auftreten (oben) unter Dev C++ problemlos durch den Compiler, während es 
beim zweiten Auftreten (unten) angemeckert wird.
"[Error] invalid conversion from 'int*' to 'int' [-fpermissive]"

Das Programm stammt aus einem Youtube Video.[1] Da erwähnt der Verfasser 
zwar bei Minute 9:05, dass das Sternchen unten nicht das gleiche ist, 
wie das oben. Aber er erklärt den Unterschied nicht so richtig.

Wieso funktioniert der gleiche Befehl oben im Programm und unten nicht?

Funktioniert das Ganze auch unter C (ohne ++)?

[1] https://www.youtube.com/watch?v=iR561UmnDXI

von NichtWichtig (Gast)


Lesenswert?

*zeigerAufA = &a; // ist ja auch falsch
Da wird versucht die Adresse von A an die int-Speicherstelle zu 
schreiben wo zeigerAufA hinzeigt.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ccccc++ schrieb:
> 1) *zeigerAufA = &a;
> 2) *zeigerAufA = 42;

Nein. Die erste Zuweisung ist keine, sondern eine Deklaration mit 
nachfolgender Initialisierung.

Dabei wird der Pointer nicht derefernziert; der "*"-Operator wirkt sich 
nur auf die Deklaration, nicht aber die Initialisierung aus.

Effektiv bedeutet
1
    int *zeigerAufA = &a;

das gleiche wie
1
    int *zeigerAufA;
2
    
3
    zeigerAufA = &a;

Genau: Bei der zweiten Zeile entfällt der "*"-Operator!

von Oliver S. (oliverso)


Lesenswert?

YouTube - Videos sind klasse, leider nicht alle.

Auch wenn das jetzt völlig old-School rüberkommt, ist in diesem Fall 
eine sequentielle Buchstabensammlung besser zur Wissensvermittlung 
geeignet. Früher nannte ma das Buch, heute gibt es sowas auch online.

Da könntest du dann nachlesen, wie man auf einen Zeiger, und wie man auf 
den Wert, auf den der Zeiger zeigt, zugreift. Der *-Operator ist, wie du 
schon erkannt hast, das Stichwort.

Ach ja, das Verhalten ist in diesem Fall unter C und C++ gleich.

Oliver

von Wilma Streit (Gast)


Lesenswert?

Bin auch kein Profi und der Fehler ist mir so erstmal nicht aufgefallen. 
Aber dafür gibt es ja die Fehlermeldungen und die ist doch eindeutig. :)

von (Gast)


Lesenswert?

Etwas übersichtlicher ist es wenn man solche Deklarationen so
1
int* zeiger = &a;
2
int& ref = a;

schreibt, also *, & zum Typ dazu, und sich auf eine Deklartion pro 
Statement beschränkt.

von Dussel (Gast)


Lesenswert?

Es wurde eigentlich schon gesagt, aber noch nicht von jedem. ;-)

'*' hat (mindestens) zwei unterschiedliche Bedeutungen/Funktionen.
Bei der Definition, also
int *Zeiger
bzw.
int* Zeiger
zeigt * an, dass 'Zeiger' kein Integer ist, sondern ein Zeiger auf einen 
Integer.

Bei der Zuweisung
*Zeiger=...
zeigt * an, dass du nicht auf 'Zeiger' selber schreiben, also die 
Adresse ändern, willst, sondern dass du die Speicherzelle, auf die der 
Zeiger zeigt ändern willst.

Also merk dir, dass * in dem Beispiel in zwei unterschiedlichen 
Bedeutungen verwendet wird.

von ccccc++ (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Effektiv bedeutet
1
> int *zeigerAufA = &a;
>
> das gleiche wie
1
> int *zeigerAufA;
2
> 
3
> zeigerAufA = &a;

Diese Erklärung durchschlägt den Knoten, der mir als OP trotz x Anläufen 
immer wieder den vollständigen Durchblich beim Zeigerkonzept verhagelte. 
Vielen Dank!

Das zitierte Programm aus Youtube hat beim Herausfinden geholfen, wie 
überhaupt die Frage lauten musste.

von Dirk B. (dirkb2)


Lesenswert?

Mal logisch gedacht:

int *zeigerAufA = &a;

ist ja eine Definition mit Initialisierung.
Der Zeiger wird angelegt und bekommt zum ersten mal einen Wert 
zugewiesen.
Das einzig sinnvolle ist eine Adresse.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.