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 />

Yukarıdaki program içinde tanımlanan func1 işlevi her çağrıldığında x değişkeni yaratılır<br />

ve işlevin çalışması sonlandığında x değişkeni bellekten boşaltılır. Her ne kadar işlevin<br />

sonlanmasından önce x değişkeninin değeri 1 artırılsa da, bunun bir sonraki çağrıya hiçbir<br />

etkisi olmaz. func1 işlevinin bir sonraki çağrısında x değişkeni yine 5 değeri ile başlatılır.<br />

Oysa func2 işlevi için durum değişiktir. func2 işlevi içindeki y isimli yerel değişken blok<br />

bilinirlik alanına ait fakat statik ömürlüdür. y değişkenine ilkdeğer verme deyimi derleyici<br />

tarafından üretilen kodun bir parçasıdır. y değişkeni programın başında 5 değeri ile<br />

başlatılır ve programın sonuna kadar bellekteki yerini korur. İşlev kaç kez çağrılırsa<br />

çağırılsın, bellekteki yeri değişmeyen aynı y değişkeni kullanılır. Bu durumda işlevin ana<br />

bloğunun sonunda y değişkeninin değeri 1 artırıldığı için bir sonraki çağrıda artık y<br />

değişkeninin değeri 6 olur. Programa ilişkin ekran çıktısını aşağıda veriyoruz.<br />

func1 işlevi 5 kez çağrılıyor!<br />

x = 5<br />

x = 5<br />

x = 5<br />

x = 5<br />

x = 5<br />

func2 işlevi 5 kez çağrılıyor!<br />

y = 5<br />

y = 6<br />

y = 7<br />

y = 8<br />

y = 9<br />

statik Yerel Nesnelerin Kullanılmasına İlişkin Ana Temalar<br />

Statik yerel nesnelerin kullanılmasına ilişkin ana temelarda, bu nesnelerin ömürlerinin<br />

statik olmasından faydalanılır. Bu temalarda global değişkenler de pekala kullanılabilir.<br />

Ancak global değişkenler statik ömürlü olmalarıyla birlikte dosya bilinirlik alanına aittir.<br />

Oysa statik yerel değişkenler blok bilinirlik alanına aittir. Global değişkenlerin dosya<br />

bilinirlik alanına sahip olmalarından kaynaklanan dezavantajlardan etkilenmemek için bir<br />

çok durumda işlevlerin statik ömürlü nesne gereksinimi statik yerel değişkenlerle<br />

karşılanır.<br />

İşlevlerin Statik Yerel Nesnelerin Adresleriyle Geri Dönmeleri<br />

Bir adres değerine geri dönen işlevlerin, yerel değişkenlerin adreslerine geri dönmemeleri<br />

gerektiğini biliyorsunuz. Çünkü yerel değişkenler otomatik ömürlüdür ve işlevin çalışması<br />

sonunda bellekten boşaltılır. Ancak static anahtar sözcüğü ile tanımlanmış yerel<br />

değişkenler, programın sonlanmasına kadar bellekteki yerlerini koruyacağından, işlevin<br />

statik bir yerel değişkenin adresine geri dönmesinde bir sakınca yoktur:<br />

#include <br />

char *get_name()<br />

{<br />

static char entry[100];<br />

printf("bir isim giriniz : ");<br />

gets(entry);<br />

}<br />

return entry;<br />

Ancak statik bir yerel dizinin adresiyle geri dönmek, dinamik bir dizinin yani malloc<br />

işleviyle yeri elde edilmiş bir dizinin adresiyle geri dönmekten farklıdır. İşlev her<br />

çağırıldığında aynı adresi döndürür. Aşağıdaki main işlevini inceleyin:<br />

344

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

Saved successfully!

Ooh no, something went wrong!