Es gibt zwei wichtige Dinge, die Sie wissen müssen.
1) Beim Aufrufen einer Funktion in C werden die Argumente immer als Wert übergeben. Wenn Sie innerhalb der FunktionenÄnderungen an den Variablen vornehmen, die den übergebenen Wert enthalten, gehen die Änderungen verloren, sobald die Funktion zurückkehrt. Mit anderen Worten: Jede innerhalb der Funktion vorgenommene Änderung kann außerhalb der Funktion nicht gesehen werden.
2) Beim Arbeiten mit Zeiger bedeutet der Operator *
vor dem Zeiger the location pointed to by the pointer
. Es heißt Dereferenzieren des Zeigers.Also, wenn Sie *px = 5;
tun, tun Sie nicht ändern Sie jeden Zeiger Wert! Sie ändern den Wert an der Stelle, auf die der Zeiger zeigt.
Ein genauerer Blick auf Ihrem Code:
In Ihrem ersten Beispiel haben Sie so etwas wie:
void swap(int px, int py)
{
int temp;
temp = px;
px = py;
py = temp;
}
int main(void)
{
int x = 10;
int y = 100;
swap(x, y);
printf("%d %d\n", x, y);
return 0;
}
In C alles von Wert übergeben wird. Wenn Sie also swap
aufrufen, werden die Werte 10
und 100
an die Funktion übergeben. Es ist nicht die Variablen x
und y
. Mit anderen Worten - px
und py
in der Funktion hat nichts mit den Variablen x
und y
in main
zu tun. Dies bedeutet, dass jede Änderung an den Variablen px
und py
verloren geht, wenn die Funktion zurückkehrt und x
und y
nicht nicht ändern.
Ihr zweites Beispiel ist wie folgt aus:
void swap(int px, int py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
}
int main(void)
{
int x = 10;
int y = 100;
swap(&x, &y); // Notice the & operator
printf("%d %d\n", x, y);
return 0;
}
Wie immer haben wir Pass von Wert. Aber in diesem Fall sind die Werte, die Sie übergeben, die Werte von zwei pointer to int
. Spezifischer übergeben Sie die Adresse x
und y
.
Wie, bevor Sie den Wert nicht ändern können, die an die Funktion übergeben wird (genau wie beim ersten Beispiel), aber Sie können ändern Sie den Wert von was auch immer der Zeiger auf zeigt.
Hier müssen Sie wissen, dass *
vor dem Zeiger zugreifen, was auch immer der Zeiger zeigt.
So wird temp = *px
den Wert lesen, auf den px
zeigt. In diesem Fall ist es 10
so temp
erhält den Wert 10
.
*px = *py
Dadurch liest den Wert py
Punkte auf (d.h. 100), und es setzt, wo px
Punkte (d.h. x
in main
nun 100
).
*py = temp
Dadurch liest der Wert temp
hält (d 10), und es setzt, wo py
Punkte (d.h. y
in main
nun 10
). Wenn die Funktion zurückkehrt, wurde der Wert x
und y
vertauscht.
Beachten Sie, dass der Code nie einen Zeiger auf (auch bekannt als die Adresse von) temp
verwendet. Die Variable temp
wird nur als gewöhnliches int
verwendet.
* Wenn der Wert von px * <= Es ist nicht der Wert von 'px', es ist der Wert der' int' 'px' Punkte zu. – dhke
Es ist völlig unklar, was Sie fragen. Sie können nicht nur Werte übergeben und erwarten, dass sie die Originale ändern. Stellen Sie eine [mcve] zur Verfügung und sehen Sie [ask]! – Olaf
Wenn Sie fragen, wie die zweite Version funktionieren könnte, temp ein int, und nicht ein Zeiger wie die beiden Parameter, ist es, weil es die Werte, auf die von ihnen gezeigt wird, nicht die Zeiger selbst. –