Dies ist keine Referenzübergabe, sondern eine Wertübergabe, wie andere angegeben haben.
Die C-Sprache wird ausnahmslos als Wert übergeben. Das Übergeben eines Zeigers als Parameter bedeutet nicht, dass Sie als Referenz übergeben werden.
Die Regel lautet wie folgt:
Eine Funktion kann den tatsächlichen Parameterwert nicht ändern.
Versuchen wir, die Unterschiede zwischen Skalar- und Zeigerparametern einer Funktion zu erkennen.
Skalare Variablen
Dieses kurze Programm zeigt die Wertübergabe mithilfe einer skalaren Variablen. param
wird als formaler Parameter bezeichnet und variable
beim Aufrufen der Funktion als tatsächlicher Parameter. Hinweis Inkrementierung param
in der Funktion ändert sich nicht variable
.
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
Das Ergebnis ist
I've received value 111
variable=111
Illusion von Referenzübergabe
Wir ändern den Code leicht. param
ist jetzt ein Zeiger.
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
Das Ergebnis ist
I've received value 111
variable=112
Das lässt Sie glauben, dass der Parameter als Referenz übergeben wurde. Es war nicht. Es wurde als Wert übergeben, wobei der Parameterwert eine Adresse ist. Der Wert vom Typ int wurde inkrementiert, und dies ist der Nebeneffekt, der uns glauben lässt, dass es sich um einen Funktionsaufruf mit Referenzübergabe handelt.
Zeiger - Wertübergabe
Wie können wir diese Tatsache zeigen / beweisen? Nun, vielleicht können wir das erste Beispiel für skalare Variablen ausprobieren, aber anstelle von skalar verwenden wir Adressen (Zeiger). Mal sehen, ob das helfen kann.
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
Das Ergebnis ist, dass die beiden Adressen gleich sind (machen Sie sich keine Sorgen über den genauen Wert).
Beispielergebnis:
param's address -1846583468
ptr's address -1846583468
Meiner Meinung nach beweist dies deutlich, dass Zeiger wertmäßig übergeben werden. Andernfalls ptr
wäre NULL
nach Funktionsaufruf.