Itu bukan pass-by-reference, yaitu pass-by-value seperti yang dinyatakan orang lain.
Bahasa C adalah pass-by-value tanpa kecuali. Melewati pointer sebagai parameter tidak berarti lulus dengan referensi.
Aturannya adalah sebagai berikut:
Suatu fungsi tidak dapat mengubah nilai parameter aktual.
Mari kita coba melihat perbedaan antara parameter skalar dan pointer dari suatu fungsi.
Variabel skalar
Program singkat ini menunjukkan nilai per nilai menggunakan variabel skalar. param
disebut parameter formal dan variable
pada pemanggilan fungsi disebut parameter aktual. Catatan kenaikan param
fungsi tidak berubah 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;
}
Hasilnya adalah
I've received value 111
variable=111
Ilusi pass-by-reference
Kami mengubah sedikit kode. param
adalah pointer sekarang.
#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;
}
Hasilnya adalah
I've received value 111
variable=112
Itu membuat Anda percaya bahwa parameter dilewatkan oleh referensi. Bukan itu. Itu diteruskan oleh nilai, nilai param menjadi alamat. Nilai tipe int bertambah, dan itulah efek samping yang membuat kita berpikir bahwa itu adalah panggilan fungsi pass-by-reference.
Pointer - melewati nilai
Bagaimana kita bisa menunjukkan / membuktikan fakta itu? Yah, mungkin kita bisa mencoba contoh pertama variabel Scalar, tetapi alih-alih skalar kita menggunakan alamat (pointer). Mari kita lihat apakah itu bisa membantu.
#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;
}
Hasilnya adalah bahwa kedua alamat tersebut sama (jangan khawatir tentang nilai pastinya).
Contoh hasil:
param's address -1846583468
ptr's address -1846583468
Menurut pendapat saya ini membuktikan dengan jelas bahwa pointer dilewatkan oleh nilai. Kalau tidak ptr
akan NULL
setelah pemanggilan fungsi.