(dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a);...

23
1 Array (Dizim) 1.1 Array Nedir? Array (dizim), aynı veri tipinden çok sayıda değişkeni barındıran bir yapı- dır. Array’e ait değişkenler, sıra numarası verilmiş bir liste gibidir. Listedeki öğelere sıra numarasıyla erişilir. Matematikteki sonlu dizi gibidir. Örnekse, matematikte 100 öğesi olan bir sonlu diziyi a = {a 0 ,a 1 ,a 2 ,...,a 99 } (1.1) biçiminde gösteririz; yani diziye ait öğeleri alt indisleriyle belirtiriz. a 7 sim- gesi, dizinin indisi 7 olan öğesini belirtir. Ayrıca, diziyi tanımlarken, öğele- rinin hangi kümeden (veri tipi) alındığı belirtilir. Örneğin, "tamsayı dizisi", dersek, öğelerin tam sayılar kümesinden seçileceği anlaşılır. Bunu ya sözle ifade ederiz, ya da a i Z, (i =0, 1, 2,..., 99) (1.2) simgesiyle belirtiriz.

Upload: vanhanh

Post on 10-Apr-2018

242 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1Array

(Dizim)

1.1 Array Nedir?

Array (dizim), aynı veri tipinden çok sayıda değişkeni barındıran bir yapı-dır. Array’e ait değişkenler, sıra numarası verilmiş bir liste gibidir. Listedekiöğelere sıra numarasıyla erişilir. Matematikteki sonlu dizi gibidir. Örnekse,matematikte 100 öğesi olan bir sonlu diziyi

a = {a0, a1, a2, . . . , a99} (1.1)

biçiminde gösteririz; yani diziye ait öğeleri alt indisleriyle belirtiriz. a7 sim-gesi, dizinin indisi 7 olan öğesini belirtir. Ayrıca, diziyi tanımlarken, öğele-rinin hangi kümeden (veri tipi) alındığı belirtilir. Örneğin, "tamsayı dizisi",dersek, öğelerin tam sayılar kümesinden seçileceği anlaşılır. Bunu ya sözleifade ederiz, ya da

ai ∈ Z, (i = 0, 1, 2, . . . , 99) (1.2)

simgesiyle belirtiriz.

Page 2: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

2 BÖLÜM 1. ARRAY

1.2 Array Bildirimi

Önce array’in veri tipi belirtilir, sonra array’e bir ad verilir. Array’in adınıizleyen köşeli parantez ( [ ]) içine arrayin bileşen sayısı yazılır. Çok boyutluarrayler için, her boyuta karşılık bir köşeli parantez kullanılır ve içine oboyuttaki bileşen sayısı yazılır.

Örnekler:1 i n t in tArr [ 100 ] ; /∗ 100 b i l e ş e n l i tek boyutlu i n t

t ip inden array b i l d i r im i ∗/f l o a t f l o a tAr r [ 9 0 ] ; /∗ 90 b i l e ş e n l i tek boyutlu f l o a tt ip inden array b i l d i r im i ∗/

i n t tab loArr [ 5 ] [ 3 ] ; /∗ 5 s a t ı r ve 3 kolonu olan i n tt ip inden i k i boyutlu array ∗/

Bilgisayar programları basit editörlerle yazılır. O editörler ai simge-sindeki gibi alt indis koyamaz. Üstelik, derleyiciler de alt indisi anlamaz. Onedenle, alt indis işlevini görmek üzere, indisler köşeli parantez içine yazılır.Dolayısıyla, arrayin öğeleri

a = {a[0], a[1], a[2], . . . , a[99]} (1.3)

biçiminde yazılır. Arrayin öğelerinin, örneğin int veri tipinden olacağınıbelirtmek için de

int a[n]; (1.4)

deyimini yazarız. Buradaki [ ] simgesine array operatörü denilir. Görüldüğügibi, bu operatörün iki işlevi vardır:

1. (1.4) deyiminde array bildirimi yapar.

2. (1.3) ifadesine { } içindeki a[i] terimleri, arrayin bileşenleridir. Genelolarak, array adından sonra gelen [ ] içindeki tamsayı, arrayin hangibileşeni olduğunu gösterir.

Dikkatle incelersek, (1.1) ile (1.3) benzerdir. (1.2) ile (1.4) aynı işlevesahiptirler.

Array yapısı hemen her dilde çok önemli roller üstlenir. İlk yaratılanüst düzeyli dillerden itibaren her dilde bu yapı vardır. Sonra yazılan C,C#, python, ruby gibi diller, bu yapıya, klasik array yapısındaki kısıtlarıkaldıran nitelikler eklemişlerdir.

Matematikteki sonlu dizi kavramına benzeyen array kavramına herprogramlama dilinde gerekseme duyulması nedeni çok açıktır. Aynı veri ti-pinden birkaç değişken tanımlamak için genel kural izlenerek gerekli sayıda

Page 3: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.3. ARRAY TÜRLERI 3

değişken bildirimi yapılabilir. Ama, aynı veri tipinden, onlarca, yüzlerce vehatta binlerce değişkene gerekseme duyuyorsak, onları tek tek tanımlamak,pratikte, olanaksız değilse bile çok çok zordur.

Öte yandan, array yapısı içinde yer alan çok sayıda bileşen (herbiribir değişkendir) ile ilgili işleri yapmak için özel fonksiyonlar yazılmıştır. Sözkonusu fonksiyonlar, array yaratma, arraylerle işlem yapma, array içinde bi-leşen arama ve array’in bileşenlerini sıralama, kopyalama gibi array ile ilgilihemen her işi yapmaya yeterlidir. Bu fonksiyonlar her array’e uygulanabi-lecek biçimde yazıldılar. Böylece, başka programlarda yeniden kullanılabilir(reusable) niteliğe kavuştular.

C dilinde array ile ilgili işleri yapan çok sayıda fonksiyon vardır. Özel-likle, arama ve sıralama foksiyonları arrayler üzerinde etkilidirler. Ayrıcastring’ler birer char arrayidir. Stringlerle yapılan işlemlerin hepsini arrayyapısından yararlanarak yaparız. Onların başlıcalarını ilerleyen sayfalardaele alacağız.

1.3 Array Türleri

C dilinde iki türlü array vardır: Dikdörtgenel arrayler, çentikli (jagged) ar-rayler. Arrray’ler tek ya da çok boyutlu olabilirler. Tek boyutlu arraylerinhepsi dikdörtgeneldir. Onlar matematikteki tek boyutlu sonlu dizilerdir.Bazı kaynaklarda ona liste denilir. Boyut sayısı iki ya da daha çok oldu-ğunda, her boyuttaki bileşen sayıları karşılıklı olarak eşitseler, array dik-dörtgenel, değilse çentiklidir. İki boyutlu dikdörtgenel arrayler tablo gibidir.İki boyutlu array’lerin uygulamada çok kullanılan tipik örnekleri matrislerve determinantlardır. Bunları örneklerle inceleyeceğiz.

C dilinde her veri tipinden array tanımlanabilir. Onların herbirisi içintek boyutlu ya da çok boyutlu arrayler yaratılabilir. Array’in bileşen türüint, float, char, vb ne olursa olsun, onun anabellekte konuşlanış ilkesi de-ğişmez. Array’in adı bir referans (işaretçi, pointer) tipidir; array yapısınınanabellekteki ilk bileşeninin adresini işaret eder. Array’in sonraki bileşen-leri anabellekte ardışık adreslere yerleşir. Bu adresler, array’in veri tipininbüyüklüğüne göre array’in öğelerine atanacak değerlerin sığacağı büyük-lükteki hücrelerdir. Daha açık bir deyişle, char tipi array için bileşenlere1 byte, int tipi array için bileşenlere 2 byte (ya da 4 byte), float tipi için4 byte, vb ayrılır. Bu özelik, array’in bileşenlerine seçkili (random) erişimisağlar. O erişimin nasıl sağlandığını biraz sonra göreceğiz.

Page 4: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

4 BÖLÜM 1. ARRAY

1.4 Tek Boyutlu Array

Çok boyutlu array’lerin nitelikleri tek boyutlu arraylerinki gibidir. O ne-denle, arraylerin özeliklerini tek boyutlu arrayler üzerinde söylemek yeter-lidir. Daha sonra çok boyutlu array’lere örnekler vereceğiz.

Tek boyutlu array, matematikteki tek boyutlu sonlu dizidir; onlartek indisli (index, damga) dizimlerdir. 0-ıncı bileşenden başlayıp sonuncubileşenine kadar indis sırasıyla dizilirler. İndisler negatif olmayan tam sa-yılardan (doğal sayılar) seçilir. Kuramsal olarak, doğal sayı veren her ifadeindis olabilir.

1.5 [ ] Operatörü

[ ] operatörünün iki işlevi olduğunu söylemiştik: Birincisi, (1.4) deyimindeolduğu gibi, array bildirimindeki işlevidir. İkincisi ise (1.3) gösterimindeolduğu gibi, arrayin bileşenlerinin sıra numarasını (indis) içermesidir.

(1.3) gösterimindeki a[i] (i = 0, 1, 2, . . .) öğelerine arrayin öğeleri, ar-rayin terimleri ya da arrayin bileşenleri denilir. Bu terimler eş anlamlıdır.[ ] operatörü, arrayin bileşenlerini (terim, öğe), indisleriyle (damga, index)belirler. a[i] simgesinde köşeli parantez içindeki i tam sayısına indis (in-dex, damga) denilir. Arrayde indisler daima tam sayıdır ve 0’dan başlar. nbileşeni olan arrayin indisleri (i = 0, 1, 2, . . . n− 1) olur.

[ ] operatörünün işlevlerini birazdan daha yakından inceleyeceğiz.

1.6 Array Yaratma

Şekil 1.1: Array

Bir array yaratmak, bir değişken yaratmak gibidir. Her değişkeninbir adı, ana bellekte bir adresi ve o adrese konulan değeri vardır. Değişken

Page 5: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.6. ARRAY YARATMA 5

adı, ana bellekte ona ayrılan yeri işaret eden bir işaretçidir (pointer).Array için de aynı kural geçerlidir. Her array’in bir adı, ana bellekte

bir adresi ve o adrese konulan bileşen değerleri vardır. Array’in adı, anabellekte arraye ayrılan yerin ilk hücresini işaret eden bir referanstır (işaretçi,pointer).

Array yaratmak, bir veri tipinden değişken yaratmaya benzer. Birdeğişken bildirimi yapılınca, ana bellekte ona bir adres ayrılır ve o değişkenadı, kendisine ayrılan adresi işaret etmeye başlar. Değişkenin bir tek adresi(hücre) vardır ve o adrese tek bir değer konulabilir. Array bildiriminde ise,tek deyim ile aynı ad ve aynı veri tipinden çok sayıda değişken aynı andayaratılmış olur. Değişken bildirimi ile array bildirimi arasındaki önemli ikifark şudur:

1. Array adı, bildirimi yapılan array’in ana bellekteki ilk bileşeninin ad-resini işaret eder.

2. Array sonlu bir dizidir. Onun bileşenlerine ana bellekte ardışık hücre-ler ayrılır. Hücre sayısı bileşen sayısı kadardır. Bu hücrelere (adres),sırasıyla, array’in terimlerinin değerleri atanır.

Kısaca söylersek, C dilinde bir array yaratmanın iki aşaması vardır:

1. Birinci Aşama : Array bildirimi

2. İkinci Aşama : Array’in bileşenlerine değer atama

Bu iki aşama birleştirilip tek deyim haline getirilebilir. Şimdi bu ikiaşamanın nasıl yapıldığını bir örnek üzerinde görelim.

Örnekler:Bir toptancı mağazasında mevcut malları gösteren bir stok kontrol

programı düşünelim. Tabii, stok kontrol programı, çok daha elverişli yapı-larla kurulmalıdır. Ama şimdilik, depodaki her eşyaya bir numara vermekiçin bir array yaratalım. Array’e depodaki nesneleri ifade etmek üzere mal,emtia, eşya gibi çağrışım yapan bir ad vermek uygun olur. Ama gösterim-lerde kısalığı sağlamak için, arrayin adını a koyalım.

int a[5]; (1.5)

deyimi int tipinden a adlı bir array bildirimidir. (1.5) deyimi bileşenleri(terimleri, öğeleri) int tipi olan 5 bileşenli bir array bildirir. Her birine int

Page 6: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

6 BÖLÜM 1. ARRAY

tipi bir değer atanacağna göre, bileşenlere ayrılan bellek adreslerinin büyük-lüğü 2 şer (ya da 4 er) byte olmalıdır. Beş bileşen olduğuna göre, arrayy’eayrılan toplam adres 2 × 5 = 10 byte uzunluğundadır. Bazı sistemlerdeint veri tipine 4 byte ayrılır. O sistemler için, (1.5) arrayine anabellekte4× 5 = 20 byte uzunluğunda yer ayrılır.

Şekil 1.2: Boş Array

Array’in adı, C dilinde adlandırma kuralına göre verilir ve öteki değiş-ken adlarının oynadığı role benzer bir rol üstlenir. Daha önce söylediğimizgibi, array adı, array yapısına ana bellekte ayrılan ardışık adreslerin ilkinigösterir; yani array’in ilk bileşeninin adresini işaret eder. Böyle olduğunugörmek için, a’nın ve a[0]’ın adreslerini yazan Program 1.1’nin çıktısınabakınız. İki bellek adresinin aynı olduğunu göreceksiniz.

Program 1.1.

#inc lude <s td i o . h>2

i n t main ( ) {i n t i ;i n t a [ 5 ] ;

7 p r i n t f ( "&a = %d \n" , &a ) ;p r i n t f ( "&a [ 0 ] = %d ]\ n" , &a [ 0 ] ) ;

r e t u r n 0 ;}

/∗∗&a = 2686636&a [ 0 ] = 2686636

4 ∗/

[ ] simgesi array operatörüdür; a ise, arrayin adıdır. Array’in adı de-ğişken adı gibidir. Nasıl ki değişken adı, onun ana bellekteki adresini işaretediyorsa, örneğimizdeki, (1.5) deyimi ile tanımlanan a, array’in ilk bileşe-ninin adresini işaret edecek bir referanstır. (1.5) bildirimi bu aşamasında aarray’i için ana bellekte bir yer ayırmıştır, ama henüz array’in bileşenlerinehiç değer atanmamıştır.

Page 7: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.6. ARRAY YARATMA 7

(1.5) deyiminde a arrayin adı, [ ] ise array yaratan operatördür. [5]ifadesi int tipi veri tutacak 5 hücre yaratır. Tabii, 5 yerine, istenilen başkabir sayı konulabilir. O sayı arrayin bileşen (terim) sayısıdır. Benzer olarak,int yerine başka bir veri tipi konulabilir.

Ana bellekte arrayin bileşenleri olarak ayrılan her hücre, arrayin aitolduğu veri tipinden verilerin sığacağı büyüklüktedir. Örneğimizde a arrayiint tipi olduğundan, ona ayrılan bileşen hücrelerinin herbirisi 2 × 8 = 16bit uzunluğundadır. Bazı sistemlerde 4 × 8 = 32 bit uzunluğunda olabi-lir. int yerine double tipten bir array olsaydı, herbir bileşen hücresi 64 bituzunluğunda olurdu.

Bu aşamada, (1.5) deyimi a tarafından işaret edilen bir array yarattı.Başka bir deyişle, ana bellekte 5 tane int değer tutacak bir yer (5 hücre)ayırdı. Bunu Şekil 1.2’deki gibi gösterebiliriz. a bellekte ayrılan bu beşhücrelik yerin ilk hücresini; yani a[0] bileşeninin olduğu adresi işaret eder.a’ya referans (işaretçi, pointer) denmesinin nedeni budur.

Tanım 1.1. Bir arrayin uzunluğu onun bileşen sayısıdır.

Örneğimizde, arrayin işaret ettiği adreste, int tipi veri tutacak şekildeyaratılan 5 tane bellek adresi (5 hücre) ana bellekte ardışıktırlar. Arrayinterimleri (bileşenleri) [ ] içine yazılan indislerle numaralanır. İlk hücreninadresi daima 0 indisiyle başlar. a[0] ilk hücreyi temsil eden değişken adıdır.Sonrakiler artan numara sırası izler. Genel kural olarak, C dilinde bir ar-rayin ilk bileşeninin indisi daima 0 ile başlar; indisler artan sıra numarasıizler.

Özetle,

Liste 1.1.

1 a [ 0 ]a [ 1 ]a [ 2 ]a [ 3 ]a [ 4 ]

adları, arrayin bileşenlerini gösterirler.Onların herbirisi int tipi bir değiş-kendir. Dolayısıyla, int tipi değişkenlerle yapılabilen her işlem, onlara dauygulanabilir.

Array’in a adı ile a[0] ilk bileşeninin adreslerinin aynı olduğu, sonrakibileşenlere de ardışık hücrelerin ayrıldığını görmek için, Program 1.2’ninçıktısına bakmak yetecektir.

Page 8: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

8 BÖLÜM 1. ARRAY

1.7 Seçkili (random) Erişim

Liste 1.2.

#inc lude <s td i o . h>

i n t main ( ) {5 i n t i ;

i n t a [ 5 ] ;p r i n t f ( "&a = %d \n" , &a ) ;

f o r ( i =0; i <5; i++)10 p r i n t f ( "&a[% i ] = %d \n" , i , &a [ i ] ) ;

r e t u r n 0 ;}

/∗∗&a = 2686632

3 &a [ 0 ] = 2686632&a [ 1 ] = 2686636&a [ 2 ] = 2686640&a [ 3 ] = 2686644&a [ 4 ] = 2686648

8 ∗/

Bu program, int tipe 4 byte ayıran bir bilgisayarda yazılmıştır. Bi-leşenlerin adreslerine bakarsanız, ardışık ikisi arasında 4 byte olduğunu gö-receksiniz.

Array adı, anabellekte &a= 2686632 adresini gösteriyor. &a= &a[0]dır. &a[1] adresini bulmak için, a[0] adresine 4 byte ekliyor. Benzer olarak&a[2], &a[3] ve &a[4] bileşen adreslerini bulmak için, &a adresine, sırasıyla,2× 4, 3× 4, 4× 4 byte ekliyor. Bu işi derleyici yapıyor. Programda arrayinbileşenlerinin adreslerini belirtmeye gerek yoktur. Bu olgu, array’e özgü birniteliktir. Bu nitelik, arrayin bileşenlerine seçkili (random) erişimi sağlar.

1.7.1 Bileşenlere Değer Atama Yöntemleri

Seçkili (random) Atama

a [ 2 ] = 1234 ;

ataması, array’in üçüncü bileşenine 1234 değerini atar. Öteki bileşenlere debenzer yolla atamalar yapılabilir. Derleyici, bileşenlerin adreslerini yukardasöylenen yöntemle bulur. Öneğin, &a[2] adresini bulmak için a’nın adresine,bir bileşeninin büyüklüğünün iki katını ekler. &a[2]= &a+ (2 ×4 byte) olur.

Page 9: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.7. SEÇKILI (RANDOM) ERIŞIM 9

Bildirim Anında Atama

Bildirim ve seçkili atama aşamalarını birleştirerek tek bir deyimle her ikisinibir arada yapabibiliriz. Örneğin,

int a[ ] = {1123, 1125, 1234, 1256, 1321}; (1.6)

deyimi hem array bildirimini hem bileşenlere değer atamasını birlikte ya-par. Bileşenlere atanacak değerler, sırasıyla, { } parantezi içine, virgül ilebirbirlerinden ayrılarak yazılmıştır. Bu atama yönteminde, bütün bileşen-lere sırasıyla değer atanıyor. a arrayinin bileşen sayısını ayrıca yazmayagerek kalmıyor; çünkü bileşenlere atanan değerler, bileşenlerin sayısını vesırasını belirliyor1. Bunu görmek için Program 1.2’i çözümleyiniz.

Program 1.2.

#inc lude <s td i o . h>

i n t main ( ) {4 i n t i ;

i n t a [ ] = {1123 , 1125 , 1234 , 1256 , 1321 } ;p r i n t f ( "%d\n" , &a ) ;

f o r ( i =0; i <5; i++)9 p r i n t f ( " a[% i ] = %d \n" , i , a [ i ] ) ;

r e t u r n 0 ;}

/∗∗&a = 2686632a [ 0 ] = 1123

4 a [ 1 ] = 1125a [ 2 ] = 1234a [ 3 ] = 1256a [ 4 ] = 1321∗/

İstenirse,

int a[5]; (1.7)

deyimi ile bildirim aşaması (ilk aşama) tamamlanır, bileşenlere değer atamaişi sonra seçkili atama ile yapılabilir.

Aşağıdaki iki yöntem aynı işi yapar.1C99 sürümünde bileşenlere sıralı olmayan atamalar yapılabilir

Page 10: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

10 BÖLÜM 1. ARRAY

Şekil 1.3: Arayin Bileşenlerinin Hepsine Değer Atama

1.Yöntem: [ ] operatörü ile array yaratırken uzunluğunu belirleyip, son-radan bileşenlerine seçkili (random) değer atama.

i n t = arr [ 1 0 ] ;2 ar r [ 6 ]=70 ; a r r [ 1 ]=20 ; a r r [ 2 ]=30 ; a r r [ 7 ]=80 ; a r r [ 4 ]=50 ;

a r r [ 3 ]=40 ; a r r [ 0 ]=10 ; a r r [ 8 ]=90 ; a r r [ 9 ]=100 ; a r r [ 5 ]=60 ;

deyimi 10 bileşenli arr adlı array yaratır sonra bileşenlerine seçkili(random) değer atar.

2.Yöntem: [ ] operatörü ile array’i yaratırken, bileşenlerine sırayla ilkdeğerlerini atama.

i n t ar r [ ] = { 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 , 100 } ;

deyimi 10 bileşenli bir array yaratır ve bileşenlerine sırayla değerleratar. arr[] ifadesi array’in uzunluğunu belirlemez; ancak { } blokuiçine sırayla yazılan değerler array uzunluğunu ve her bileşene sıraylaatanan değeri kesinlikle belirler. { } içindeki değerlerin yazılış sırası ilebileşenlerin indis sırası uyumludur. Örneğin, { } içindeki 7.değer 7.bi-leşene aittir. Tabii, 7.bileşenin indisinin 6 olduğunu biliyoruz; çünküdamgalama işlemi 1 den değil 0 dan başlar. O nedenle arr[6] = 70dir. Array’lerde bu özeliği daima anımsamalıyız.

1.7.2 Örnekler

Liste 1.3.

Page 11: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.7. SEÇKILI (RANDOM) ERIŞIM 11

i n t d e r s l i k [ 3 ] ;i n t d e r s l i k [ 3 ] = {0 , 1 , 2} ;

4 s t r i n g kent [ ] = { "Erzurum" ’ , "Van " , " Samsun " , " Adana " , " Muğla " } ;

s t r i n g kent [ 5 ] = {"Erzurum" ’ , "Van" , "Samsun " , "Adana" , "Muğla " } ;

s t r i n g kent [ 5 ] ; kent [ 4 ] ="Muğla " ; kent [ 1 ] = "Van" ; kent [ 3 ] = "Adana" ; kent [ 2 ] = "Samsun " ; kent [ 0 ] ="Erzurum" ;

Açıklamalar:

1. İlk örnek: int tipinden derslik adlı 3 bileşenli array bildirimini yapıyor.Bileşenlere değer atamıyor.

2. İkinci örnek: önce int tipinden derslik adlı 3 bileşenli array bildiriminiyapıyor. Bileşenlere sırayla değer atıyor.

3. Üçüncü örnek: String tipinden kent adlı beş bileşenli bir array bildiri-yor. Ama atanan değerlerin sayısı bileşen sayısını ve sırasını belirliyor.Bileşenlere yapılan atama, arrayin uzunluğunu dinamik olarak, belir-liyor. Tabii, bu atama deyiminden sonra yeni atamalar yapılarak, kentarrayinin uzunluğu değiştirilemez.

4. Dördüncü örnek: String tipinden kent adlı beş bileşenli bir array bil-diriyor. Sonra bileşenlere ilk değerlerini sırayla atıyor.

5. Beşinci örnek: String tipinden beş bileşeni olan kent adlı bir arraybildiriyor. Bildirim anında array yaratılmış olur. Sonra bileşenlere ilkdeğerleri seçkili (random) atanıyor.

1.7.3 Array’in Bileşenleri

a[i] (i = 0, 1, 2, 3, 4) ifadeleri, yaratılan array içinde birer değişkendir. Budeğişkenler sayesinde, array beş tane int tipi veriyi bir arada tutabilme ye-teneğine sahip olur. Bu değişkenlere array’in bileşenleri (öğeleri, terimleri)denir. 0, 1, 2, 3, 4 sayıları bileşenlerin sıra numaralarıdır; indis (damga, in-dex) adını alırlar. Sıra numaraları (indis) daima 0 dan başlar, birer artarakgider. n tane bileşeni olan bir array’in ilk bileşeninin damgası 0, son bileşeni-nin damgası (n−1) olur. Bir array’in uzunluğu (length) onun bileşenlerininsayısıdır.

Page 12: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

12 BÖLÜM 1. ARRAY

1.7.4 Array’in Bileşenlerine Erişim

Daha önce de söylediğimiz gibi, bir değişkene erişmek demek, ona değeratamak, atanan değeri okumak ve gerektiğinde değerini değiştirmek demek-tir. Array’in bileşenleri de birer değişken olduklarından, onlara istendiğindedeğer atanabileceği, istenirse atanan değerlerin değiştirilebileceği açıktır.Yukarıda yaptığımız

i n tSay i [ i ] = i ∗ 10 ;

atama deyimi, array’lerin üstün bir niteliğini ortaya koyar. Array’in istenenbileşenine indis (index) sayısı ile seçkili (doğrudan, random) erişmek müm-kündür. Her bileşen bir değişken olduğu için, o bileşen tipiyle yapılabilenher işlem onlar için de yapılabilir, değişkenlerle ilgili kurallar bileşenler içinde aynen geçerlidir. Gerçekten, yukarıdaki deyim, indisi 2 olan bileşene 20değerini atamıştır.

1.7.5 Örnekler

Program 1.3.

#inc lude <s td i o . h>

i n t main ( ) {4 i n t i ;

cha r ∗kent [ 5 ] = { "Van" , " Trabzon " , " Kayser i " , "Mardin " , "Adana" } ;f o r ( i = 0 ; i < 5 ; i++)

p r i n t f ( " kent [%d ] = %s \n" , i , kent [ i ] ) ;}

/∗∗2 kent [ 0 ] = Van

kent [ 1 ] = Trabzonkent [ 2 ] = Kayser ikent [ 3 ] = Mardinkent [ 4 ] = Adana

7 ∗/

C dilinde her veri tipinden array yaratılabilir. Örneğin, yukarıdakicha r kent [ ] = { "Van" , " Trabzon " , " Kayser i " , "Mardin " , "Adana" } ;

deyimi char tipinden bir array bildirmiş, onun bileşenlerine string tipindendeğerler atamıştır. Bu atama

kent [ 0 ] = "Van" ;kent [ 1 ] = " Trabzon " ;kent [ 2 ] = " Kayser i " ;

4 kent [ 3 ] = "Mardin " ;kent [ 4 ] = "Adana" ;

Page 13: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.7. SEÇKILI (RANDOM) ERIŞIM 13

atamalarına denktir.Yukarıda yaptıklarımızı özetleyelim.

v e r iT i p i arrayAdı [ b i l e ş e n_ s a y ı s ı ] ; // array b i l d i r im i

Array nesnesi yaratmak demek, ana bellekte array’in bileşenlerine bi-rer yer (bileşen adresi, hücre) ayırmak demektir. array nesnesi yaratılırken,bileşenlerine ilk değerler atanabilir. Ama ilk değerler atanmazsa, bileşen-lere değerleri sonradan atanabilir. Ancak, değer atanmadan önce bileşendeğerleri kullanılmamalıdır.

Arrray bileşenlerine değer atama: Array nesnesi yaratıldıktan sonraonun bileşenlerine değer atama eylemi, diğer değişkenlere değer atama gi-bidir. İstenen bileşen indeks sayısı ile seçilerek (seçkili, random) değer ata-nabilir. Örneğin, yukarıda yapıldığı gibi,

kent [ 2 ] = " Kayser i " // atama

deyimi kent adlı array’in 3.bileşenine "Kayseri" değerini atamaktadır.

1.7.6 Bileşenlerin Öntanımlı Değerleri

Şekil 1.4: Bileşenlerin Öntanımlı Değerleri

Bir değişken tanımlandığında, onu kullanmadan önce değer vermeyialışkanlık edinmeliyiz. Aynı kural, arrayin bileşenleri için de geçerlidir. Bazıderleyiciler, global olarak tanımlanan değişkenlere ve arraylerin bileşenle-rine öntanımlı değerler verirler. Ama bazı derleyiciler bunu yapmaz. Önta-nımlı değer atandığı varsayımı ile yazılacak kaynak programlar taşınabilir(reusable) olmaz. Üstelik bir fonksiyon (blok) içinde tanımlanan değişkenve arraylere hiç bir derleyici öndeğer (default value) vermez.

Page 14: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

14 BÖLÜM 1. ARRAY

Unutmayalım ki, C derleyicisi veri tipi denetimi yapmaz. Değer atan-mamış bir değişken ya da array bileşeni kullanıldığında, onun adresindeönceki programdan kalmış ne varsa onu kullanır. Böyle olması ciddi hata-lara neden olabilir.

Örnekler:Program 1.4, global sayısal arraylerin bileşenlerine 0 değerinin önde-

ğer (default) olarak atandığını gösteriyor.

Program 1.4.

#inc lude <s td i o . h>

i n t garr [ 5 ] ;4

i n t main ( ) {i n t i ;

f o r ( i =0; i <5; i++)9 p r i n t f ( "%d\ t " , gar r [ i ] ) ;

r e t u r n 0 ;}}

/∗∗0 0 0 0 0

3 ∗/

Açıklamalar:Hiç bir fonksiyonun ya da blokun içinde olmayan değişken ve array-

ler global’dır. Glaobal değişkenlere ve arraylere, programın her tarafındanerişilebilir. garr arrayi global’dir. garr arrayinin bileşenlerine değer atan-madığ halde, bileşen değerleri 0 olmuştur. Çünkü, global sayısal arraylerinbileşenlerine 0 öntanımlı (default) değeri atanır.

Bildirim anında önüne static nitelemi konulan değişkenler ve arraylerstatic olurlar. Static öğeler na bellekete özel konuşlanırlar. Program 1.5’de6.satırda bildirimi yapılan starr adlı array static’tir. Sayısal static array-lerin bileşenlerine 0 öndeğeri (default) atanır.

Program 1.5.

2 #inc lude <s td i o . h>

i n t main ( ) {i n t i ;s t a t i c i n t s t a r r [ 5 ] ;

7f o r ( i =0; i <5; i++)

Page 15: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.8. SIZEOF İŞLECI 15

p r i n t f ( "%d\ t " , s t a r r [ i ] ) ;

r e t u r n 0 ;12 }

/∗∗0 0 0 0 0

3 ∗/

Açıklamalar:starr arrayinin bileşenlerine değer atanmadığ halde, 9.satırın verdiği

çıktıda bileşen değerleri 0 olmuştur. Çünkü, static nitelemli sayısal array-lerin bileşenlerine 0 öntanımlı (default) değeri atanır.

1.8 sizeof İşleci

Bir değişkene ya da array’e, ana bellekte kaç byte uzunluğunda yer ayrıl-dığını bilmek için sizeof operatörü kullanılır. Gerçekte, sizeof birli birişleçtir; ana bellekte değişkene ayrılan yerin büyüklüğünü byte cinsindenbildirir. Dinamik bellek yönetiminde çok işe yarar. Program 1.6’in çıktısı,char, int, float, double veri tipleri ile int tipinden array ve float tipindenarray için ana bellekte ayrılan bellek büyüklüklerini byte cinsinden göste-riyor.

Program 1.6.

#inc lude <s td i o . h>2

i n t main ( ) {cha r ch ;i n t i ;f l o a t x ;

7 doub l e w;

i n t a [ 5 ] ;f l o a t b [ 5 ] ;

12 p r i n t f ( " char t i p i n e ay r ı l a n yer :%d byte ’ d i r \n " , s i z e o f ( ch ) );

p r i n t f ( " i n t t i p i n e ay r ı l a n yer :%d byte ’ d i r \n " , s i z e o f ( i ) ) ;p r i n t f ( " f l o a t t i p i n e ay r ı l a n yer :%d byte ’ d i r \n " , s i z e o f ( x ) ) ;p r i n t f ( " double t i p e ay r ı l a n yer :%d byte ’ d i r \n " , s i z e o f (w) ) ;

17 p r i n t f ( " f l o a t t ip inden b ar ray ine yer %d byte ’ d i r \n " ,s i z e o f (b) ) ;

p r i n t f ( " i n t t ip inden a a r ray ine ay r ı l a n yer %d byte ’ d i r \n " ,s i z e o f ( a ) ) ;

r e t u r n 0 ;}

Page 16: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

16 BÖLÜM 1. ARRAY

/∗∗char t i p i n e ay r ı l a n yer : 1 byte ’ d i ri n t t i p i n e ay r ı l a n yer : 4 byte ’ d i r

4 f l o a t t i p i n e ay r ı l a n yer : 4 byte ’ d i rdouble t i p e ay r ı l a n yer : 8 byte ’ d i rf l o a t t ip inden b ar ray ine ay r ı l a n yer 20 byte ’ d i ri n t t ip inden a a r ray ine ay r ı l a n yer 20 byte ’ d i r

∗/

1.8.1 Array’in Uzunluğunu Bulma

C dilinde arrayin uzunluğunu bulan bir fonksiyon yoktur. Ama böyle birfonksiyonu kolayca yazabiliriz.

sizeof operatörü ile array’e ana bellekte ayrılan bellek adresinin bü-yüklüğünü byte cinsinden bulabiliyoruz. (bkz. Kesim 1.8). Arrayin veri tipibilindiğine göre, her bileşene ayrılan bellek büyüklüğü bellidir. Dolayısıyla,arraye ayrılan bellek büyüklüğünü, bir bileşenine bellekte ayrılan büyük-lüğe bölersek, arrayin kaç bileşeni olduğu ortaya çıkar. Örneğin, yukarıdakia arrayinin uzunluğu

s i z e o f ( a ) / s i z e o f ( a [ 0 ] ) ;

deyimi ile belirlenir.Örnekler:

Program 1.7.

#inc lude <s td i o . h>

i n t main ( )4 {

i n t a [ ] = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9} ;i n t uzunluk = s i z e o f ( a ) / s i z e o f ( i n t ) ;p r i n t f ( " Array ’ in uzunlugu = %d " , uzunluk ) ;

9 r e t u r n 0 ;}

/∗∗Array ’ in uzunluğu = 10∗/

Program 1.8, array uzunluğunu makro olarak tanımlıyor.

Program 1.8.

#inc lude <s td i o . h>2 #de f i n e ARRAY_UZUNLUK( ar r ) s i z e o f ( a r r ) / s i z e o f ( a r r [ 0 ] )

Page 17: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.9. ARRAYLER ÜZERINDE DÖNGÜLER 17

i n t main ( ) {cha r ∗ k en t l e r [ ] = { "Ankara " , "Mardin " , " Edirne " } ;

7 p r i n t f ( " Array ’ in uzunlugu = %d " , ARRAY_UZUNLUK( ken t l e r ) ) ;}

/∗∗2 Array ’ in uzunluğu = 10

∗/

Program 1.9, array uzunluğunu makro olarak tanımlıyor. Genel ola-rak, C dilinde array ile pointer tipleri birbirlerinden farklıdır. Ama, array,bir pointer gibi kullanılabilir.

Program 1.9.

#inc lude <s td i o . h>2 #de f i n e ARRAY_UZUNLUK(x ) ( s i z e o f ( x ) / s i z e o f (∗x ) )

i n t main ( ) {i n t t e k l e r [ ] = { 1 ,3 , 5 , 7 , 9 , 11 , 13 , 1 , 5 , 1 , 7 , 19 } ;

7 p r i n t f ( " Array ’ in uzunlugu = ’%d " , ARRAY_UZUNLUK( t e k l e r ) ) ;}

/∗∗2 Array ’ in uzunluğu = 10

∗/

1.9 Arrayler Üzerinde Döngüler

Array’ler çok sayıda değişken tanımlama ve bileşenlerine doğrudan erişimsağlamaları yanında, döngüleri de çok kolaylaştırırlar. Array’in bileşenle-rine indisleriyle erişilebildiği için, array üzerindeki döngüler için indislerkullanılır. Arrrayler üzerinde döngüler for, while ve do-while yapıları ilekurulabilir.

Aşağıdaki programlar, arrayler üzerinde döngülerin kuruluşunu gös-teriyor.

Bileşenlere Döngü İle Değer Atama

Array bileşenlerine değer atama eylemi, genellikle program koşarken dina-mik olarak yapılır. Aşağıdaki iki örnekte, bir döngü ile array bileşenlerininbazılarına değer atanmaktadır. Sonra başka bir döngü ile bütün bileşenlerindeğerleri ekrana yazdırılmaktadır. Değer atanmamış bileşenlerin (default)değerlerinin 0 olduğuna dikkat ediniz.

Page 18: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

18 BÖLÜM 1. ARRAY

Program 1.10.

#inc lude <s td i o . h>2

i n t main ( ){

i n t i ;i n t kare [ 1 0 ] ;

7 f o r ( i = 6 ; i < 10 ; i++){

kare [ i ] = i ∗ i ;}f o r ( i = 0 ; i < 10 ; i++)

12 {p r i n t f ( "%d −−> %d" , i , kare [ i ] ) ;p r i n t f ( " \ t " ) ;

}}

/∗∗0 −−> −1920360389 1 −−> −2 2 −−> 19598580103 −−> 196024636 4 −−> 4201520 5 −−> 2686820

4 6 −−> 36 7 −−> 49 8 −−> 69 −−> 81∗/

Açıklamalar:10 bileşenli kare arrayinin ilk altı bileşenine değer atanmamış, son

dört bilşene değer atanmıştır. C derleyicisi bileşenlere değer atanıp atanma-dığına bakmadan, bileşenlerin adreslerinde yazılı olan değerlerin karelerinihesaplıyor. Dolayısıyla, ekrana gelen ilk altı değer, program hatasındankaynaklanıyor. Bu örnek, kullanılmadan önce arrayin bileşenlerine değeratanması gerektiğini gösteriyor.

Program 1.11.

#inc lude <s td i o . h>

i n t main ( )4 {

i n t i ;i n t i n tSay i [ 5 ] ;f o r ( i = 0 ; i < 5 ; i++)in tSay i [ i ] = i ∗ 10 ;

9f o r ( i = 0 ; i < 5 ; i++)p r i n t f ( "%i x 10 = %d " , i , i n tSay i [ i ] ) ;

}

/∗∗0 x 10 = 0 1 x 10 = 10 2 x 10 = 20

3 3 x 10 = 30 4 x 10 = 40∗/

Page 19: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.9. ARRAYLER ÜZERINDE DÖNGÜLER 19

Program 1.12, dokuz bileşenli bir arrray’in bileşen değerlerini for dön-güsü ile yazıyor.

Program 1.12.

1 #inc lude <s td i o . h>

i n t main ( ) {i n t i ;i n t Sayi [ 9 ] = { 4 , 6 , 7 , 3 , 8 , 2 , 1 , 9 , 5 } ;

6f o r ( i =0; i < 9 ; i++)

p r i n t f ( "%i " , Sayi [ i ] ) ;r e t u r n 0 ;

}

/∗∗4 , 6 , 7 , 3 , 8 , 2 , 1 , 9 , 5

∗/

Program 1.13.

#inc lude <s td i o . h>2

i n t main ( ) {i n t i ;i n t ar r [ ]= { 20 , 25 , 13 , 41 , 52 , 63 , −43, −86, 0 } ;

7 f o r ( i =0; i <9; i++) {p r i n t f ( "%d\ t " , a r r [ i ] ) ;

}}

/∗∗20 25 13 41 52 63 −43 −86 0

∗/

Program 1.14, arr adlı arrayin bileşenlerine for döngüsü ile kendiindislerini atıyor ve onları yazıyor.

Program 1.14.

#inc lude <s td i o . h>2 #de f i n e ARRAY_UZUNLUK 5

i n t main ( ) {i n t i nd i s , a r r [ARRAY_UZUNLUK] ;

7 f o r ( i n d i s = 0 ; i n d i s < ARRAY_UZUNLUK; i n d i s++) {ar r [ i n d i s ] = i nd i s ;p r i n t f ( " a r r [%d ] = %d\n" , i nd i s , a r r [ i n d i s ] ) ;

}p r i n t f ( " \n " ) ;

Page 20: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

20 BÖLÜM 1. ARRAY

12r e t u r n 0 ;

}/∗∗

ar r [ 0 ] = 017 ar r [ 1 ] = 1

ar r [ 2 ] = 2ar r [ 3 ] = 3ar r [ 4 ] = 4

∗/

Program 1.15, ilk 100 içinde 10’un katları olan sayıları topluyor

Program 1.15.

#inc lude <s td i o . h>

i n t main ( ) {4 i n t k ;

i n t toplam = 0 ;i n t on la r [ ] = { 10 ,20 ,30 ,40 ,50 ,60 ,70 ,80 ,90 ,100} ;

f o r ( k=0; k <=10 ; k++) {9

toplam = toplam + 10∗k ;p r i n t f ( "%d " , toplam ) ;

}}

/∗∗2 0 10 30 60 100 150 210 280 360 450 550

∗/

Program 1.16 array’i for, while ve do-while döngüleri ile yazıyor.

Program 1.16.

#inc lude <s td i o . h>2 #de f i n e MAX 10

i n t main ( ) {

i n t i=MAX;7 i n t dizim [MAX] = {10 ,20 ,30 ,40 ,50} ;

// f o r döngüsü i l ef o r ( i =0; i<MAX; i++) {

12 p r i n t f ( " dizim [%d ] = %d " , i , diz im [ i ] ) ;}

p r i n t f ( " \ nwhi le dongusu : \ n " ) ;// whi l e döngüsü i l e

17 i n t k = 0 ;w h i l e ( ( k>−1) && (k<10) ) {

Page 21: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.10. ARRAY’IN PARAMETRE OLMASI 21

p r i n t f ( " dizim [%d ] = %d " , k , dizim [ k ] ) ;k++ ;

}22

p r i n t f ( " \ndo−whi le dongusu : \ n " ) ;

i n t j = 0 ;do {

27 p r i n t f ( "\%d\ t " , diz im [ j ] ) ;j++ ;

} w h i l e ( ( j >=0) && ( j <=9)) ;}

/∗∗f o r döngüsü :dizim [ 0 ] = 10 dizim [ 1 ] = 20 dizim [ 2 ] = 30 dizim [ 3 ] = 40 dizim [ 4 ] =50 dizim [ 5 ] = 0

dizim [ 6 ] = 0 dizim [ 7 ] = 0 dizim [ 8 ] = 0 dizim [ 9 ] = 05

whi le dongusu :dizim [ 0 ] = 10 dizim [ 1 ] = 20 dizim [ 2 ] = 30 dizim [ 3 ] = 40 dizim [ 4 ] =50 dizim [ 5 ] = 0

dizim [ 6 ] = 0 dizim [ 7 ] = 0 dizim [ 8 ] = 0 dizim [ 9 ] = 0

10 do−whi le dongusu :10 20 30 40 50 0 0 0 0

0∗/

Açıklamalar:7.satırda dizim adlı 10 bileşenli array bildirimi yapılıyor. Ama ilk beş

bileşenine değer atanıyor.12, 19 ve 27.satırlardaki çıktılarda, değer atanmamış son beş bileşen

değeri 0 oluyor. Bunlar, değer atanmamış bileşenlere derleyicinin atadığıöndeğerlerdir (default values). Her derleyici bu işi yapmayabilir. O nedenle,kullanılmadan önce array’in bileşenlerine değerler atanmalıdır.

1.10 Array’in Parametre Olması

Program 1.17, arraylerin bileşenlerine pointer ile erişilebileceğini gösteriyor.

Program 1.17.

#inc lude <s td i o . h>

3 i n t s t a r r [ 5 ] ;

i n t main ( ) {i n t i ;i n t ar r [ ] = {1 , 3 ,5 , 7 , 9} ;

Page 22: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

22 BÖLÜM 1. ARRAY

8f o r ( i =0; i <5; i++)

p r i n t f ( "%d\ t " , a r r [ i ] ) ;

p r i n t f ( " \n " ) ;13 f o r ( i =0; i <5; i++)

p r i n t f ( "%d\ t " , ∗( a r r + i ) ) ;

r e t u r n 0 ;}

/∗∗1 , 3 ,5 , 7 , 9

3 1 , 3 ,5 , 7 , 9∗/

Açıklamalar:10. satır bileşenlere indis ile erişiyor.14.satır bileşenlere array pointeri ile erişiyor. Her ikisi aynı çıktıyı

veriyor.

Array Yapısının Kısıtları:

Procedural dillerde olduğu gibi, C dili de elbette array yaratmaya ve arrayüzerinde işlem yapacak metotları tanımlama yeteneğine sahiptir.

Array yapısı, hemen her dilde veri koleksiyonlarını işlemek için vaz-geçilemeyen kullanışlı bir yapıdır. Ama bu yapının iki kısıtı vardır:

1. Array’in uzunluğu değiştirilemez.Yukarıda yaptığımız gibi, array’in uzunluğunu (boyutunu, bileşen-lerinin sayısını) ya bildiriminde belirtiriz ya da bileşenlerine ilk de-ğerlerini atayarak arrayin boyutunu belirlemiş oluruz. Her durumda,arrayin uzunluğu başlangıçta kesinkes belirlenmiş olur.Ancak, bazı durumlarda, arrayi yarattıktan sonra, array’in bileşensayısını artırmak ya da azaltmak gerekebilir. Ne var ki, aynı bellekadresinde o iş yapılamaz. O zaman yeni uzunluğa göre yeni bir arraytanımlayıp, eski arrayin öğelerini yeni arraye taşımak gerekir. Bu işiyapan fonksiyonları yazmak mümkündür. Ama bu iş yapılırken anabellekte hem yeni, hem eski array bileşenleri yer alır. Eski arrayinöğelerini yenisine taşımak için fonksiyonlar yazılır. Bütün bunlar, ar-rayin uzunluğunu değiştirmenin bedelidir. Bu işler, eski array’e ayrı-lan bellek bölgesinde yapılamadığı için, array uzunluğu değiştirilemez(immutable), denilir. Bunun anlamı, array’in uzunluğunun, ilk tanım-landığı bellek bölgesinde değiştirilemeyeceğidir.

Page 23: (Dizim)tkaracay/etudio/ders/prg/c/array1.pdf · 7 printf("&a=%d\n" , &a); printf("&a[0]=%d]\n", &a[0]); ... {1123, 1125, 1234, 1256, 1321 }; printf("%d\n" , &a); for (i=0; i

1.10. ARRAY’IN PARAMETRE OLMASI 23

2. Array’in bileşen değerleri aynı veri tipindendir.Bazı durumlarda farklı veri tiplerinden oluşan veri koleksiyonlarınıişlemek gerekebilir. O zaman, bileşenleri aynı veri tipinden olan arrayyapısı işimize yaramaz. Java, C#, Python, Ruby gibi yeni diller farklıveri tiplerinden oluşan koleksiyonlarla iş yapmayı sağlayan yapılargetirmişlerdir.