Questo non è pass-by-reference, cioè pass-by-value come affermato da altri.
Il linguaggio C è pass-by-value senza eccezioni. Passare un puntatore come parametro non significa pass-by-reference.
La regola è la seguente:
Una funzione non è in grado di modificare il valore dei parametri effettivi.
Proviamo a vedere le differenze tra i parametri scalare e puntatore di una funzione.
Variabili scalari
Questo breve programma mostra il valore per passaggio usando una variabile scalare. param
viene chiamato parametro formale e variable
all'invocazione della funzione viene chiamato parametro effettivo. L'incremento della nota param
nella funzione non cambia 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;
}
Il risultato è
I've received value 111
variable=111
Illusione del pass-by-reference
Modifichiamo leggermente il codice. param
è un puntatore ora.
#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;
}
Il risultato è
I've received value 111
variable=112
Questo ti fa credere che il parametro sia stato passato per riferimento. Non era. È stato passato per valore, il valore param è un indirizzo. Il valore del tipo int è stato incrementato e questo è l'effetto collaterale che ci fa pensare che fosse una chiamata di funzione pass-by-reference.
Puntatori - passati per valore
Come possiamo dimostrare / dimostrare questo fatto? Bene, forse possiamo provare il primo esempio di variabili scalari, ma invece di scalari usiamo gli indirizzi (puntatori). Vediamo se questo può aiutare.
#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;
}
Il risultato sarà che i due indirizzi sono uguali (non preoccuparti del valore esatto).
Risultato di esempio:
param's address -1846583468
ptr's address -1846583468
A mio avviso, ciò dimostra chiaramente che i puntatori sono passati per valore. Altrimenti ptr
sarebbe NULL
dopo l'invocazione della funzione.