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

i = ROW * COL;<br />

while (i--)<br />

printf("%2d ", *ptr++);<br />

printf("\n");<br />

}<br />

return 0;<br />

Daha önce yazılan main işlevine bir eklemenin yapıldığını görüyorsunuz.<br />

ptr = &a[0][0];<br />

deyimi ile<br />

int * türünden ptr nesnesine matris içinde yer alan ilk int türden nesnenin adresi atanır. i<br />

değişkenine ROW * COL ifadesinin değeri, yani matriste yer alan toplam eleman sayısı<br />

atanmıştır.<br />

Bu durumda while (i--) döngüsü matrisin eleman sayısı kadar döner, değil mi? Döngünün<br />

gövdesinde yer alan printf çağrısı ile döngünün her turunda *ptr nesnesinin değeri<br />

yazdırılmış ve daha sonra sonek konumunda olan ++ işleciyle göstericinin değeri 1<br />

artırılmış yani göstericinin bellekte bir sonraki int türden nesneyi göstermesi sağlanmıştır.<br />

Böylece matris içinde yer alan bütün değerler ekrana yazdırılmıştır.<br />

Buradan şu anlaşılmalıdır: İki boyutlu dizinin elemanları aslında belleğe ardışıl olarak<br />

yerleştirilen tek boyutlu dizilerdir.<br />

İki Boyutlu Dizilerin İşlevlere Geçirilmesi<br />

Aslında iki boyutlu bir dizinin işleve geçirilmesi tek boyutlu dizilerin işleve<br />

geçirilmesinden farklı değildir. Bir diziyi işleve geçirmek için dizinin ilk elemanının adresi<br />

ve dizinin boyutu işleve gönderilir, değil mi?<br />

Peki yukarıdaki örnekte yer alan a gibi bir dizinin ilk elemanı nedir? Bu dizinin ilk elemanı<br />

a[0]'dır. Ve bu 10 elemanlı int türden bir dizidir. Şimdi bu elemanın adresinin alındığını<br />

düşünelim:<br />

&a[0]<br />

Bu ifadenin türü nedir? C diline yeni başlayanlar böyle bir ifadenin türünün (int **) türü<br />

olması gerektiğini düşünürler. Oysa bu ifadenin türü daha önce karşılaşmadığımız bir<br />

türdür:<br />

10 elemanlı int türden bir dizinin adresi olabilecek bir tür!<br />

Bu tür biligisi C dilinde şöyle ifade edilir:<br />

int (*)[10];<br />

Yani a dizisinin ilk elemanı bu türden bir göstericiye atanabilir:<br />

int (*ptr)[10] = &a[0];<br />

Bir dizinin ismi bir ifade içinde işleme sokulduğunda otomatik olarak dizinin ilk elemanın<br />

adresine dönüştürülür, değil mi? O zaman &a[0] ifadesi yerine doğrudan a ifadesi de<br />

yazılabilir:<br />

int (*ptr)[10] = a;<br />

Evet, a ifadesinin türü int ** değil, int (*)[10] türüdür.<br />

313

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

Saved successfully!

Ooh no, something went wrong!