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

}<br />

free(ptr);<br />

/***/<br />

return 0;<br />

main işlevi içinde çağrılan create_person işlevinin geri döndürdüğü adres, struct Person<br />

türünden bir gösterici değişken olan ptr'de tutuluyor. İşlev, dinamik bir nesnenin adresini<br />

döndürdüğünden, dinamik alanı geri vermek, işlevi çağıran kod parçasının<br />

sorumluluğundadır.<br />

Böyle bir işlev yerel bir yapı değişkeninin adresine geri dönemez. Global bir yapı<br />

değişkeninin adresine de geri dönmesinin çoğu zaman fazlaca bir anlamı yoktur.<br />

İşlev, dinamik olarak yeri ayrılmış bir yapı nesnesinin adresi ile de geri dönebilir.<br />

Elde edilen dinamik alanın "heap" bellek alanına geri verilmesi, işlevi çağıran kod<br />

parçasının sorumluluğundadır. main içinde free işlevine yapılan çağrı ile dinamik alanın<br />

geri verildiğini görüyorsunuz.<br />

Bir işlevin yerel bir yapı nesnesinin adresine geri dönmesi tipik bir gösterici hatasıdır.<br />

Yerel yapı nesneleri de static anahtar sözcüğüyle bildirilebilir. Şüphesiz bir işlevin static<br />

bir yapı nesnesinin adresine geri dönmesi bir gösterici hatası değildir.<br />

Bileşik Nesneler ve İçsel Yapılar<br />

Bir yapının elemanı başka bir yapı türünden olabilir.<br />

Bir yapının elemanının başka bir yapı türünden olabilmesi iki ayrı biçimde sağlanabilir:<br />

Önce eleman olarak kullanılan yapı türü bildirilir. Bu bildirimin görülür olduğu bir yerde<br />

elemana sahip olan yapının bildirimi yapılır. Aşağıdaki örneği inceleyin:<br />

struct Date {<br />

int day, month, year;<br />

};<br />

struct Student {<br />

char name[30];<br />

struct Date birth_date;<br />

int no;<br />

};<br />

Yukarıdaki örnekte önce struct Date yapısı bildiriliyor. Daha sonra yapılan struct Student<br />

türünün bildiriminde, struct Date türünden bir eleman kullanılıyor.<br />

İkinci yöntemde, eleman olan yapı değişkeninin bildirimi, elemana sahip yapının bildirimi<br />

içinde yapılır:<br />

struct Student {<br />

char name[30];<br />

struct Date {<br />

int day, month, year;<br />

}birth_date;<br />

int no;<br />

};<br />

Yukarıdaki örnekte yer alan struct Date yapısı gibi, bir yapının içinde bildirilen yapıya<br />

"içsel yapı" (nested structure) denir. Burada, içte bildirilen yapı da sanki dışarıda<br />

bildirilmiş gibi işlem görür. Yani içeride bildirilen yapı türünden değişkenler tanımlanabilir.<br />

Yukarıdaki kod parçası yalnızca bir bildirime karşılık gelir. birth_date isimli bir nesne<br />

tanımlanmış olmaz. struct Student türünden bir nesne tanımlandığında, bu yapı<br />

nesnesinin struct Date türünden birth_date isimli elemanı olur.<br />

İki ayrı sözdiziminden herhangi birinden sonra struct Student türünden bir nesne<br />

tanımlanmış olsun:<br />

struct Student s;<br />

377

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

Saved successfully!

Ooh no, something went wrong!