08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

Bir işlevin bir adres bilgisine geri dönmesinin başka faydaları da olabilir. Hesaplanmak<br />

istenen bir değeri dışarıya iletmek yerine, hesaplanan bu değeri içinde tutacak bir<br />

nesnenin adresi dışarıya iletilebilir. Nasıl olsa bir nesnenin adresi elimizdeyken o nesnenin<br />

değerine de ulaşabiliriz, değil mi?<br />

Type sözcüğü bir tür belirtiyor olsun. Type türünden bir değer döndüren bir işlevin<br />

bildirimi aşağıdaki gibidir:<br />

Type foo(void);<br />

Böyle bir işlevin geri dönüş değerini saklamak için bu kez Type türünden bir nesneye işlev<br />

çağrı ifadesini atamak gerekir.<br />

Type val = foo();<br />

Type türden bir nesne bellekte 100 byte yer kaplıyor olsun. Bu durumda, çağrılan foo<br />

işlevinin çalışması sırasında return deyimine gelindiğinde 100 byte'lık bir geçici nesne<br />

oluşturulur. return ifadesinden bu geçici nesneye yapılan atama 100 byte'lık bir bloğun<br />

kopyalanmasına neden olur. Geçici nesnenin val isimli değişkene aktarılması da, yine 100<br />

byte'lık bir bellek bloğunun kopyalanmasına neden olur.<br />

Şimdi de aşağıdaki bildirime bakalım:<br />

Type *foo(void);<br />

Bu kez işlev hesapladığı nesnenin değerini içinde taşıyan Type türünden bir nesnenin<br />

adresini döndürüyor. Bu durumda, işlevin geri dönüş değerini içinde taşıyacak geçici<br />

nesne yalnızca, 2 byte ya da 4 byte olur, değil mi? Yani 100 byte'lık bir blok kopyalaması<br />

yerine yalnızca 2 ya da 4 byte'lık bir kopyalama söz konusudur.<br />

Böyle bir işlevin geri dönüş değerini saklamak için, işlev çağrı ifadesinin bu kez Type *<br />

türünden bir nesneye atanması gerekir.<br />

Type *ptr;<br />

ptr = foo();<br />

foo işlevinin hesapladığı değeri içinde tutan Type türünden nesnenin adresi, Type<br />

türünden bir gösterici değişkene atanıyor. Type türünün sizeof değeri ne olursa olsun bu<br />

işlem, yalnızca bir göstericinin sizeof değeri kadar büyüklükte bir bloğun kopyalanmasına<br />

neden olur, değil mi?<br />

Bir işlevin, bir değerin kendisini dışarıya iletmesi yerine o değeri içinde tutan nesnenin<br />

adresini dışarıya iletmesi, bellek ve zaman kullanımı açısından maliyeti düşürür.<br />

Bir de başka bir faydadan söz edelim. Bir işlevden bir nesnenin değerini alınırsa, bu<br />

değeri taşıyan nesne değiştirilemez. Ancak bir işlevden bir nesnenin adresi alınırsa, adresi<br />

alınan nesne değiştirilebilir.<br />

Yukarıda yazılan getmax işlevi bize dizinin en büyük elemanının adresini döndürüyordu,<br />

değil mi? Aşağıdaki main işlevini inceleyin:<br />

255

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!