Ce n'est pas un passage par référence, c'est un passage par valeur comme d'autres l'ont dit.
Le langage C est pass-by-value sans exception. Passer un pointeur en tant que paramètre ne signifie pas passer par référence.
La règle est la suivante:
Une fonction n'est pas en mesure de modifier la valeur réelle des paramètres.
Essayons de voir les différences entre les paramètres scalaires et pointeurs d'une fonction.
Variables scalaires
Ce programme court montre le passage par valeur en utilisant une variable scalaire. param
est appelé le paramètre formel et variable
à l'invocation de la fonction est appelé paramètre réel. Notez que l'incrémentation param
dans la fonction ne change pas 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;
}
Le résultat est
I've received value 111
variable=111
Illusion de passe-par-référence
Nous modifions légèrement le morceau de code. param
est un pointeur maintenant.
#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;
}
Le résultat est
I've received value 111
variable=112
Cela vous fait croire que le paramètre a été transmis par référence. Ce n'était pas. Il a été transmis par valeur, la valeur param étant une adresse. La valeur de type int a été incrémentée, et c'est l'effet secondaire qui nous fait penser qu'il s'agissait d'un appel de fonction passe-par-référence.
Pointeurs - transmis par valeur
Comment pouvons-nous montrer / prouver ce fait? Eh bien, nous pouvons peut-être essayer le premier exemple de variables scalaires, mais au lieu de scalaires, nous utilisons des adresses (pointeurs). Voyons voir si cela peut aider.
#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;
}
Le résultat sera que les deux adresses sont égales (ne vous inquiétez pas de la valeur exacte).
Exemple de résultat:
param's address -1846583468
ptr's address -1846583468
À mon avis, cela prouve clairement que les pointeurs sont transmis par valeur. Sinon, ce ptr
serait NULL
après l'invocation de la fonction.