08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

struct Date {<br />

int day, month, year;<br />

};<br />

struct Person {<br />

char name[30];<br />

struct Date *bdate;<br />

int no;<br />

};<br />

struct Person per;<br />

şeklinde bir tanımlama yapılmış olsun:<br />

per.bdate ifadesi struct Date * türündendir. Bu ifade bir nesne belirtir.<br />

per.bdate->day ifadesinin türü int'dir. Bu ifade de nesne gösterir.<br />

&per.bdate->day ifadesinin int * türündendir.<br />

Tabi bu örnekte, bir değer ataması yapılmamışsa, per.bdate ile belirtilen gösterici içinde<br />

rastgele bir adres vardır. Bu göstericinin bir gösterici hatasına neden olmadan<br />

kullanılabilmesi için güvenilir bir adresi göstermesi gerekir. Örneğin bu alan malloc<br />

işleviyle dinamik olarak elde edilebilir:<br />

per.bdate = (struct Date *) malloc (sizeof(struct Date));<br />

Yukarıdaki örnekte elimizde yalnızca struct Person türünden bir gösterici olduğunu<br />

düşünelim.<br />

struct Person *ptr;<br />

1. ptr->bdate ifadesini struct Date * türündendir.<br />

2. person->bdate->day ifadesinin türü int'dir.<br />

Bu örneklerde henüz hiçbir yer ayırma işlemi yapılmamıştır. Hem ptr hem de ptr->date<br />

gösterici değişkenleri için, dinamik bellek işlevleriyle yer elde edilmesi gerekir:<br />

ptr = (struct Person *) malloc(sizeof(struct Person));<br />

ptr->bdate = (struct Date *) malloc(sizeof(struct Date));<br />

Burada dinamik olarak elde edilen alanlar ters sırada serbest bırakılmalıdır:<br />

free(ptr->bdate);<br />

free(ptr);<br />

Bir yapının elemanı, kendi türünden bir yapı değişkeni olamaz. Örneğin:<br />

struct Sample {<br />

struct Sample a; /* GEÇERSİZ */<br />

};<br />

Çünkü burada struct Sample yapısının uzunluğu belirlenemez. Ancak bir yapının elemanı<br />

kendi türünden bir gösterici olabilir. Örneğin:<br />

struct Node {<br />

int val;<br />

struct Node *ptr;<br />

};<br />

384

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

Saved successfully!

Ooh no, something went wrong!