# int Werte tauschen mit Pointern



## ElMadridano (8. Jul 2018)

Hallo,
ich hab ein Problem mit C programmieren. Und zwar hab ich schon bei der Aufgabe das Main Programm und den Funktionsprototypen gegeben, aber ich komme nicht mehr weiter. Ich habe allgemein das mit den Pointern nicht so richtig verstanden, was diese pointer sind. Weil sie sind keine Adresse und kein Inhalt sondern einfach nur ein Pfeil, welches irgendwo hinzeigt? Könnt ihr mir da diesbezüglich was sagen? Und zu meiner Aufgabe, hoffe ich das ihr mir da helfen könnt, was muss in die Void Funktion rein? Vielleicht ein paar Tipps oder vielleicht auch direkt die Lösung mit Erklärung. Ich wäre aufjedenfall dankbar.

Danke
void tausche(int *Zeiger1, int *Zeiger2)
{
}
int main ()
{
    int a = 10, b  = 20;
    printf("a ist gleich: %i \n b ist gleich: %i \n", a,b);
    tausche(&a,&b);
    printf("a ist gleich: %i \n b ist gleich: %i\n", a,b);
    return 0;
}


----------



## ElMadridano (8. Jul 2018)

Tut mir Leid für den Doppelpost, aber habe soeben eine Lösung im Internet gefunden und sie funktioniert, leider hab ich keine Ahnung wieso, weshalb, warum das so ist. 
Hier die Lösung:
void tausche(int *Zeiger1, int *Zeiger2)
{
    int C;
    C = *Zeiger1;
    *Zeiger1=*Zeiger2;
    *Zeiger2=C;
}
int main ()
{
    int a = 10, b  = 20;
    printf("a ist gleich: %i \n b ist gleich: %i \n", a,b);
    tausche(&a,&b);
    printf("a ist gleich: %i \n b ist gleich: %i\n", a,b);
    return 0;
}

In der Void Funktion haben wir die beiden Zeiger1 und 2. Wenn ich dort was verändere, wieso betrifft das dann a und b, wieso werden die mit geändert?

Danke


----------



## httpdigest (8. Jul 2018)

ElMadridano hat gesagt.:


> Ich habe allgemein das mit den Pointern nicht so richtig verstanden, was diese pointer sind. Weil sie sind keine Adresse und kein Inhalt sondern einfach nur ein Pfeil, welches irgendwo hinzeigt?


Praktisch gesehen sind Zeiger Adressen. Das heißt, eine Variable vom Typ `int*` (also Zeiger auf int) enthält eine Adresse, die bei gewissen Operationen (Zeigerdereferenzierung und Zeigerarithmetik) als Adresse, an der ein int gespeichert ist, interpretiert wird.



ElMadridano hat gesagt.:


> Wenn ich dort was verändere, wieso betrifft das dann a und b, wieso werden die mit geändert?


Weil du mit &a und &b der Funktion 'tausche' die Adressen von a und b übergibst. Dann ist 'tausche' auch in der Lage, per Dereferenzierungsoperator '*' den Speicherbereich, in dem die Werte von a und b gespeichert sind, zu ändern.


----------



## ElMadridano (8. Jul 2018)

httpdigest hat gesagt.:


> Weil du mit &a und &b der Funktion 'tausche' die Adressen von a und b übergibst. Dann ist 'tausche' auch in der Lage, per Dereferenzierungsoperator '*' den Speicherbereich, in dem die Werte von a und b gespeichert sind, zu ändern.


Aber wieso ist &a mit dem *Zeiger1 verknüpft und z.B nicht mit *Zeiger2 ? Ist das wegen der Reihenfolge, das in der void tausche Funktion der *Zeiger1 an erster stelle steht und deshalb mit &a verknüpft ist, weil er auch an der ersten stelle steht wie hier z.B. "tausche(&a,&b);" ? ich wird das mal ausprobieren, aber ich danke dir sehr


----------



## httpdigest (8. Jul 2018)

ElMadridano hat gesagt.:


> Ist das wegen der Reihenfolge, das in der void tausche Funktion der *Zeiger1 an erster stelle steht und deshalb mit &a verknüpft ist, weil er auch an der ersten stelle steht wie hier z.B. "tausche(&a,&b);" ?


Ganz genau. Die Parameterreihenfolge bei Funktionsdeklarationen entspricht der Argumentreihenfolge bei Funktionsaufrufen. Das i-te aktuelle Argument wird immer auf den i-ten Funktionsparameter abgebildet.


----------

