zeigerfrage



  • hallo erstmal, bin gerade dabei c zu lernen, jetzt habe ich einmal eine frage zu zeigern: folgendes programm habe ich geschrieben:

    #include <stdio.h>

    void tausch(int *a, int *b){
    b=a;
    }

    int main(){
    int a=1,b=2;
    printf("%d%d",a,b);
    tausch(&a,&b);
    printf("%d%d",a,b);
    getchar();
    }

    Nach dem ersten Aufrufen müsste doch die Adresse von b gleich der Adresse von b sein. Also musste der Wert an der Adresse a ja auch der Wert der Adresse b sein, denn sie zeigen ja beide auf die selbe stellen. nach dem aufrufen von tausch(&a,&b) ist aber immer noch a=1 und b=2. Warum geht das nicht.
    Also ich will nicht wissen, wie man das macht, denn das weiss ich, sonder nur zm Verständniss, warum dieses nicht funzt.

    mfg Lorsch



  • hi

    das liegt daran, dass du die pointer-adressen nur in der funktion änderst;
    außerhalb der funktion, ist diese änderung nicht mehr möglich.
    dieses verhalten nennt man auch scope

    was geht

    int a=1,b=2;
    void tausch_werte(int *a, int *b)
    {
       *b = *a
    }
    tausch(&a,&b);
    

    bzw.

    int c = 5;
    int *d;
    void tausch_pointer(int **a, int **b)
    {
       *b = *a;
    }
    tausch_pointer(&&c, &d);
    

    ein

    tausch_pointer(&&a, &&b);
    

    geht jedoch nicht, weil du dann versuchst eine adresse einer lokalen variable zu überschreiben, was aber nicht erlaubt ist.



  • Hmm,
    am besten mal schrittweise:

    void tausch(int a, int b) //ohne Sternchen
    {
      a = b;
    }
    

    Hier werden nicht die Variablen übergeben, sondern ihr Inhalt kopiert.
    Das heißt, du kannst hier nicht die Originalvariablen verändern.
    Dies ist dir sicherlich schon klar.

    Deswegen übergibt man Pointer:

    void aendere(int *a)
    {
      *a = 87;
    }
    

    Nun verändert man den Wert, der an der Adresse steht.
    Die Adresse an sich aber, wird wieder nur wieder kopiert.
    Du verstehst jetzt? Sie kann man also nicht ändern, so wie man im vorherigen Beispiel den Wert nicht ändern konnte, da es nur eine Lokalkopie ist.

    Lösung: Einfach eine Adresse des Pointers übergeben:

    void aendere(int **a, int* b) 
    {
    
      *a = b; // Wert des zweiten Pointers a zuweisen
    }
    

    Alle Klarheiten beseitigt?



  • nöööö...

    @esskar: ich habe keine Ahnung, was du mit deinem doppelpointer-"code" anfangen willst.

    @Seppi:
    die variablen im main lauten:

    int a=1,b=2;
    

    er braucht eine funktion "tausche"

    void tausche(int *a,int *b);
    

    der aufruf wäre:

    tausche(&a,&b);
    

    die funktion tausche, besagt doch eigendlich, das werte getauscht werden sollten:

    void tausche(int *a,int *b)
    {
       int help;
       help=*a;
       *a=*b;
       *b=help;
    }
    

    aber in deinem fall 🙄 :
    void tausche(int *a,int *b)
    {
    *b=*a;
    }

    mfG (c)h



  • @chille:
    is klar; aber lorsch hätt es wohl nicht viel gebracht, wenn man ihm die lösung einfach hin geschrieben hätte ohne ihm ein wenig zu erklären, was es damit auf sich hat, oder?


Anmelden zum Antworten