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

Yani dizi global ise, dizi elemanı olan nesneler dosya bilinirlik alanına (file scope) ve statik<br />

ömre (static storage duration) sahip olurlar. Global bir dizi söz konusu olduğunda eğer<br />

dizi elemanlarına değer verilmemişse, dizi elemanları 0 değeriyle başlatılır. Ama yerel<br />

diziler söz konusu olduğunda, dizi elemanı olan nesneler blok bilinirlik alanına (block<br />

scope) ömür açısından ise otomatik ömür karakterine (automatic storage class) sahip<br />

olur. Değer atanmamış dizi elemanları içinde çöp değerler (garbage values) bulunur.<br />

Aşağıdaki programı yazarak derleyin:<br />

#include <br />

#define SIZE 10<br />

int g[SIZE];<br />

int main()<br />

{<br />

int y[SIZE];<br />

int i;<br />

for (i = 0; i < SIZE; ++i)<br />

printf("g[%d] = %d\n", i, g [i]);<br />

for (i = 0; i < SIZE; ++i)<br />

printf("y[%d] = %d\n", i, y [i]);<br />

}<br />

return 0;<br />

Dizilerin Birbirine Atanması<br />

Dizilerin elemanları nesnedir. Ancak bir dizinin tamamı bir nesne olarak işlenemez:<br />

int a[SIZE], b[SIZE];<br />

gibi bir tanımlamadan sonra, a dizisi elemanlarına b dizisinin elemanları kopyalanmak<br />

amacıyla, aşağıdaki gibi bir deyimin yazılması sözdizim hatasıdır.<br />

a = b; /* Geçersiz */<br />

Yukarıdaki gibi bir atama derleme zamanı hatasına neden olur. Çünkü dizilerin isimleri<br />

olan a ve b nesne göstermez. Dizinin bellekte kapladığı toplam alan doğrudan tek bir<br />

nesne olarak işlenemez. Yani dizinin elemanları birer nesnedir ama dizinin tamamı bir<br />

nesne değildir. C'de dizi isimleri dizilerin bellekte yerleştirildikleri bloğun başlangıcını<br />

gösteren, dizinin türü ile aynı türden adres değerleridir. Dolayısıyla değiştirilebilir sol taraf<br />

değeri (modifiable L value) değillerdir.<br />

İki dizi birbirine ancak bir döngü deyimi ile kopyalanabilir:<br />

for (i = 0; i < SIZE; ++i)<br />

a[i] = b[i];<br />

Yukarıdaki döngü deyimiyle b dizisinin her bir elemanının değeri a dizisinin eş indisli<br />

elemanına atanıyor. Dizilerin kopyalanması için başka bir yöntem de bir standart C işlevi<br />

olan memcpy işlevini kullanmaktır. Bu işlev "göstericiler" konusunda ele alınacak.<br />

Dizilerin Kullanımına İlişkin Örnekler<br />

Aynı türden nesneler bir dizi altında tanımlanırlarsa, bir döngü deyimi yardımıyla dizi<br />

elemanlarının tamamını işleme sokan kodlar kolay bir biçimde yazılabilir. Aşağıdaki örneği<br />

dikkatle inceleyin:<br />

204

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

Saved successfully!

Ooh no, something went wrong!