Referansların Fonksiyon Parametresi Olarak Kullanılması

Araff

Kıdemli Üye
18 Nis 2012
2,871
0
Cennet ile C
Referanslar fonksiyon parametresi olarak kullanılabilirler. Madem ki bir referans aynı türden bir nesneyle ilk değer verilerek tanımlanmak zorundadır, o halde parametresi referans olan fonksiyonlar aynı türden bir nesnenin kendisiyle çağırılmak zorundadır.



/* fonksiyon parametresi olan referans örneği */



#include



#if 1 /* parametresi referans */

**** fonk(int &a)

{

a = 20;

}



**** main(****)

{

int x = 10;



fonk(x);

printf("%d\n", x);

}

#endif



#if 0 /* gösterici karşılığı */

**** fonk(int *a)

{

*a = 20;

}



**** main(****)

{

int x = 10;



fonk(&x);

printf("%d\n", x);

}

#endif

/*------------------------------------------------------------*/





Bir C programında fonk(a) gibi bir çağırma işlemiyle a değiştirilemez. Oysa C++’ta böyle bir çağırma fonksiyonun parametre değişkeni bir referans ise a paametresini değiştirebilir. Klasik bir C bakış açısıyla parametre olan a’nın değiştirilmeyeceği sanılabilir. Okunabilirliği kuvvetlendirmek için eğer parametreyi değiştirecek bir fonksiyon tasarlanacaksa bunun için referans değil gösterici kullanılmalıdır. Fonksiyonun parametre değişkeni referans ise derleyici tarafından otomatik olarak yapılan bir adres aktarımı söz konusudur.



Referans uygulaması

int a = 10;

int &r1 = a;

int &r2 = r1;



r2 = 20;

printf(“%d\n”, r1);





Gösterici eşdeğeri

int a = 10;

int *r1 = &a;

int r2 = &r1;



*r2 = 20;

printf(“%d\n”, *r1);





/*-----referans.cpp-----*/

#include



#if 1 /* referans örneği */



**** main(****)

{

int a = 10;

int &a1 = a;

int &a2 = a1;



a2 = 20;

printf("%d\n", a1);

}



#endif



#if 0 /*gösterici eşdeğeri */



**** main(****)

{

int a = 10;

int *a1 = &a;

int *a2 = a1;



*a2 = 20;

printf("%d\n", *a1);

}



#endif

/*-------------------------*/



/*-----referan1.cpp-----*/

#include



**** main(****)

{

int a = 10;

int &b = a;





printf("%p %p\n", &a, &b);

}

/*--------------------------*/



Bir referans & operatörüyle adres alma işlemine sokulabilir. Bu durumda elde edilen değer referans içerisinde bulunan adreste bulunan nesnenin adresidir. Bu da referans içerisindeki adresle aynı olmak zorundadır. Bir referansın da bir adresi vardır. Ama o adres değeri geçerli bir ifdade ile elde edilemez. r bir referans olmak üzere & &r; ifadesi geçerli değildir. Çünkü bu ifadenin eşdeğer gösterici karşılığı & &*p;’dir ve &*p bir nesne değildir.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.