c++: verstehe Zeiger-Konzept nicht

Gast #5875388
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
Persönliche Seite #5875406
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!
#5875409
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
Gast #5875480
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.
Gast #5875987
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren