Isso não é passar por referência, é passar por valor, como outros declararam.
A linguagem C é transmitida por valor, sem exceção. Passar um ponteiro como parâmetro não significa passagem por referência.
A regra é a seguinte:
Uma função não pode alterar o valor real dos parâmetros.
Vamos tentar ver as diferenças entre os parâmetros escalar e ponteiro de uma função.
Variáveis escalares
Este pequeno programa mostra a passagem por valor usando uma variável escalar. param
é chamado de parâmetro formal e, variable
na chamada de função, é chamado de parâmetro real. A nota incrementada param
na função não muda 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;
}
O resultado é
I've received value 111
variable=111
Ilusão de passagem por referência
Mudamos um pouco o código. param
é um ponteiro agora.
#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;
}
O resultado é
I've received value 111
variable=112
Isso faz você acreditar que o parâmetro foi passado por referência. Não era. Foi passado por valor, o valor do parâmetro sendo um endereço. O valor do tipo int foi incrementado, e esse é o efeito colateral que nos faz pensar que era uma chamada de função de passagem por referência.
Ponteiros - passados por valor
Como podemos mostrar / provar esse fato? Bem, talvez possamos tentar o primeiro exemplo de variáveis escalares, mas, em vez de escalares, usamos endereços (ponteiros). Vamos ver se isso pode ajudar.
#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;
}
O resultado será que os dois endereços são iguais (não se preocupe com o valor exato).
Resultado de exemplo:
param's address -1846583468
ptr's address -1846583468
Na minha opinião, isso prova claramente que os ponteiros são passados por valor. Caso contrário, ptr
seria NULL
após a chamada da função.