Bir işaretçiyi bir fonksiyona nasıl göndeririz? Bir değer ile göndermekle bir referans ile göndermek arasında ne gibi farklar vardır? Bu yazıda bu gibi sorulara cevap arayacağız.
Bir değer ile fonksiyon çağırmak nedir?
#include <iostream>
int squareByValue(int n)
{
return n*n;
}
int main(int argc, const char** argv)
{
int i = 5;
std::cout << "Call by value: " << squareByValue(i) << "\n";
return 0;
}
Bu paylaşmış olduğumuz kodda bir sayının karesini almak için yazmış olduğumuz fonksiyonun bize vereceği cevap 25 dir. Çok basit bir şekilde tanımlamış olduğumuz bir değişkeni değeriyle beraber fonksiyona göndermiş olduk. Yani aslında şu şekilde çağırmış olduk.
squareByValue(5);
Bir sayıyı değeriyle fonksiyona gönderdik. Bu yöntem gayet basit ve anlaşılabilir bir yöntemdir.
Peki ya bir fonksiyona bir değişkenin adresini göndererek(referans ile gönderme) nasıl o fonksiyondan istediğimiz sonucu alırız? Öncelikle kodumuzu inceleyelim.
#include <iostream>
void squareByReference(int *nPtr)
{
*nPtr = *nPtr * *nPtr;
}
int main(int argc, const char** argv)
{
int i = 5;
squareByReference(&i);
std::cout << "Call by reference: " << i << std::endl;
return 0;
}
Yukarıda yazmış olduğumuz kodda görüldüğü üzere bir değişkeni bir fonksiyona &(referans) ile gönderiyoruz. Yani biz fonksiyona o değişkenin adresini gönderiyoruz.
void squareByReference(int *nPtr)
Bu tanımda fonksiyonun bir işaretçi parametre alacağını söylüyoruz. Fonksiyonun içinde işaretçiyi referanstan kurtarmak içinse başına * işareti koyuyoruz.
*nPtr = *nPtr * *nPtr;
Burada bellek adresinden eriştiğimiz değeri kendisiyle çarparak yine kendisine atıyoruz. Bu sayede bir adresi hiç değiştirmeden içindeki değerin karesini alabiliyoruz. Bu kullanım şekline referans ile gönderme deniliyor.