C dilinde işlevlere parametreler her zaman değerine göre iletilir — yani çağrılan koddan bir değer kopyası işlevin içine gönderilir. Eğer işlev dışında bir değişkenin değerini değiştirmek gerekiyorsa, işaretçi ile iletim kullanılır.
Bir skalar (örneğin, int) iletildiğinde işlev kendi kopyasını alır:
void foo(int a) { a = 10; } int main() { int x = 5; foo(x); // x == 5, değişmeyecek! }
Değişkenin değerini değiştirmek için işaretçi kullanılır:
void foo(int* a) { *a = 10; } int main() { int x = 5; foo(&x); // x == 10, değer değişti! }
Dizi, işlevin bir parametresi olarak referansla mı iletilir?
Birçok kişi "referansla" diye yanıt verir, ancak C dilinde işlev imzasında dizi referansla iletilmez, aslında işaretçiye dönüşür.
Doğru cevap:
Bir dizi bir işleve iletildiğinde, aslında ilk elemanının işaretçisi iletilir. Yani çağrılan işlev, dizinin gerçek boyutunu bilmez ve dizinin elemanlarındaki herhangi bir değişiklik orijinal diziye yansır.
void foo(int arr[]) { arr[0] = 100; } int main() { int a[3] = {1,2,3}; foo(a); // a[0] 100 olacak! }
Tarihçe
int arr[10] olarak tanımlanan bir dizinin değerlerini güncelleyordu, ancak çağrıldığı kodda dizi daha küçük bir boyuttaydı. İşlev gerçek boyutu bilmediğinden, tampon taşması ve bellek bozulması meydana geldi.