Bu referans olarak değil, diğerlerinin belirttiği gibi by-pass-by değeridir.
C dili istisnasız her bir geçiş değeri. Bir işaretçiyi parametre olarak iletmek, referansla geçmek anlamına gelmez.
Kural şudur:
Bir işlev gerçek parametre değerini değiştiremez.
Bir fonksiyonun skaler ve işaretçi parametreleri arasındaki farkları görmeye çalışalım.
Skaler değişkenler
Bu kısa program, skaler değişken kullanarak by-pass değerini gösterir. param
formal parametre olarak adlandırılır ve variable
işlev çağrısındaki gerçek parametre olarak adlandırılır. İşlevdeki artış param
artmaz 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;
}
Sonuç
I've received value 111
variable=111
Referans yoluyla yanılsama
Kod parçasını biraz değiştiriyoruz. param
şimdi bir işaretçi.
#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;
}
Sonuç
I've received value 111
variable=112
Bu, parametrenin referans olarak geçtiğine inanmanızı sağlar. O değildi. Değere göre geçti, param değeri bir adres. İnt türü değeri artırıldı ve bu, onu bir by-pass işlev çağrısı olduğunu düşündüren yan etkidir.
İşaretçiler - değere göre geçti
Bu gerçeği nasıl gösterebiliriz / kanıtlayabiliriz? Belki Skaler değişkenlerin ilk örneğini deneyebiliriz, ancak skaler yerine adresleri (işaretçiler) kullanıyoruz. Bakalım bu yardımcı olabilir mi?
#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;
}
Sonuç, iki adresin eşit olması olacaktır (kesin değer için endişelenmeyin).
Örnek sonuç:
param's address -1846583468
ptr's address -1846583468
Kanımca bu, işaretçilerin değere göre geçildiğini açıkça kanıtlıyor. Aksi takdirde işlev çağırma işleminden sonra ptr
olur NULL
.