zeig mir den Zeiger



  • Hi,
    ich habe im Moment ein naja großes Problem mit der Zeigerei und bäuchte da nochmal ne Erdung.

    I Also wofür sind & und * gut.

    II void f(int zahl) ...
    void f(int* zahl) ...
    void f(int& zahl) ...
    sind ja was verschiedenes, aber was und wieso?

    III und wie verhalten sich dann f(*p); und f(p); in einem Programm?



  • & Adressoperator zeigt die Adresse von einer Variablen an.
    * Inhaltsoperator, zeigt den Inhalt eines Pointers an, dh, dass wo er drauf zeigt.

    Beispiel :

    int i = 2//Adresse(&) 0x1 , wert 2;//fiktiv ;)
    int *pi =NULL// Adresse(&) 0x2, wert NULL ; // erzeigt noch auf nichts, und ist deshalb mit NULL initialisiert
    pi = &i; // pi = wert 0x1, also da wo 2 Steht.
    *pi = 3; //stelle auf die der Inhalt von pi zeigt auf 3 setzen. (i ist jetzt 3)
    

    Devil



  • Hi,

    Also wofür sind & und * gut.

    & ist im Verbindung mit Zeigern der Addressoperator, mit dem du einem Zeiger
    auf die Addresse einer Variablen zeigen lassen kannst.

    Beispiel:

    int i = 5;
    int *j = &i; //j zeigt jetzt auf i
    

    * ist der Dereferenzierungsoperator oder oft auch als Inhaltsoperator bezeichnet
    Mit diesem Operator (nicht mit dem Mal-Operator verwechseln) kannst du auf
    den Inhalt einer Zeigervariable zugreifen.

    Beispiel:

    int *i = 5;
    std::cout <<"Inhalt von i: " << *i << std::endl <<"Addresse: " << i;
    

    II void f(int zahl) ...
    void f(int* zahl) ...
    void f(int& zahl) ...

    void f(int zahl): Definiert eine Funktion, welche einen Integer als Parameter
    erwartet. Dabei wird der uebergebene Wert lokal fuer die Funktion kopiert.
    Ein aendern des Wertes, aendert _nicht_ den original (uebergebenen) Wert

    void f(int *zahl): Definiert eine Funktion, welche einen Zeiger auf einen
    Integer erwartet. Uebergeben wird die Addresse einer Integerzahl.

    Beispiel:

    int i = 5;
    f( &i );
    

    Aendert man zahl, so aendert sich auch i, da hier die Addresse von i uebergeben
    wird und somit der Original-Wert veraendert wird.

    void f(int &zahl): Definiert eine Funktion, welche eine Referenz auf einen
    Integer erwartet. Uebergabe eines Parameters erfolgt normal:

    int i = 5;
    f(i);
    

    Auch hier, wird referenziert 'zahl' auf i, womit der Inhalt von i geaendert
    wird, wenn sich 'zahl' in der Funktion aendert.
    Das ist nicht mit Zeigern zu vergleichen. Es kann keine NULL-Referenz geben, es
    muss ein gueltiger Wert sein.

    III und wie verhalten sich dann f(*p); und f(p); in einem Programm?

    Bei ersterem Wird der Wert, auf den p zeigt uebergeben, bei dem letzteren
    die Addresse, auf die p zeigt.

    Hoffe ich konnte dir helfen, falls ich was falsch gemacht habe, bitte ich
    um korrektur.

    mfg
    v R



  • Vielen Dank für die schelle Hilfe. Ich denke damit komme ich erst mal weiter bei meinem Poblem.

    Ich hatte nur etwas den Überbick verloren und in der Fachliteratur keine einfache schnelle Erklärung gefunden.



  • int *i = 5; ?



  • Original erstellt von PeterTheMaster:
    *int i = 5; ?

    Das ist undefiniert!(imho)
    du kannst einem Pointer eigentlich keinen Wert zu weisen,
    sondern nur eine Adresse.

    Devil



  • Original erstellt von PeterTheMaster:
    int *i = 5; ?
    Original erstellt von devil81:
    Das ist undefiniert!(imho)

    Ne. Das ist nicht undefiniert. Das ist ein völlig definierter Fehler: Ein int-Wert != 0 kann nicht benutzt werden um einen Zeiger auf int zu initialisieren.



  • Ups, also hab ich doch en Fehler gemacht.

    Denkt es euch als

    int *i;
    *i = 5;
    

    😉

    mfg
    v R



  • Original erstellt von virtuell Realisticer:
    **Ups, also hab ich doch en Fehler gemacht.

    Denkt es euch als

    int *i;
    *i = 5;
    

    😉

    mfg
    v R**

    Dürfte auch nicht gehen, bzw. führt zum Programm absturz... 😉

    Devil

    [ Dieser Beitrag wurde am 12.06.2003 um 14:48 Uhr von devil81 editiert. ]



  • Wie? Eine Speicherzelle hat *i doch, oder nicht? Kann in dieser lediglich ne
    Addresse stehn?

    Ihr vermiesst mir meinen Beitrag 😃

    Ok, also nocheinmal:

    int i = 5;
    int *j = &i;
    
       std::cout <<"Wert: " << *j <<" Addresse: " << j << std::endl;
    

    *g* Hoffe ich hab es jetzt richtig gemacht, sonst werd ich gleich das
    Kapitel fuer Zeiger wiederholen, versprochen!! 😃

    mfg
    v R



  • du hast die iostream nicht eingebunden 😉 :p

    Also es funzt deswegen net, weil int *p; *p =5; 5 wäre jetzt eine Konstante,
    du musst deswegen erst eine variable belegen, auf die der zeiger zeigen kann.

    Devil


Anmelden zum Antworten