ARRAY
Array, bir ad ve bir damga (index) ile aynı türden çok sayıda değişkeni tanımlamak için kullanılan bir yapı türüdür. Genel olarak bir array'in bildiriminde sözdizimi şöyledir:
tür ad[n] = {değerler}; (1)
Burada tür derleyicide hazır olan temel veri türlerinden birisi olabileceği gibi, programcının yarattığı bir yapı (struct) türü de olabilir. ad yerine istenen herhangi bir ad verilebilir; C derleyicisinin ad için koyduğu kısıtlamalar dışında bir kısıtlama yoktur. Array bildiriminde [] içindeki n
bir tamsayıdır ve array dizininde kaç öğe var olacağını belirtir. 0 dan başlayarak n-1 sayısına dek giden bu sayılara array'in damgaları denilir. Array dizinindeki her öğe kendisine ayrılan damga ile kesinlikle belirli bir değişkendir. Eğer array'in öğelerine değerler adanacaksa, bu değerler damga sırasına göre { } içine yazılır.
Örnek
int puan[5] = {68,85,45,98,74}; (2)
bildirimi int türünden
puan[0], puan[1], puan[2], puan[3], puan[4] (3)
adlı 5 tane değişken yaratir. Bunlara puan adlı array'in öğeleri adı verilir. Matematiksel sözlerle belirtmek gerekirse, (2) bildiriminde puan[5] simgesi 5 öğeli sonlu bir diziyi temsil eder. Bu dizinin öğeleri int değerlere sahiptir.
C dilinde array damgaları 0 dan başlar(*). (2) nin sağ yanında yapıldığı gibi, array bildiriminde ad ve [ ] içine öğe sayısı yazıldıktan sonra eşitlik yazıp { } içine değerler konulursa, o değerler yazılış sırasına göre, damgaların büyüyen sırasında array'in öğelerine adanmış olurlar. (2) bildirimi array'in öğelerine şu değerleri adamış olur:
Array bildirimi yapılırken öğelerine değer adamak gerekli değildir. Çoğu kez, başlangicta array tanıtılır (adı, türü ve öğe sayısi belirtilir); sonra da program içinde istenen değerleri alması sağlanır. Örneğin,
double ücret[564];
char soyad[20];
int liste[adet];
int *oda[18];
double *fonk[5]( );
deyimlerinin herbiri bir array tanımlamaya yarar.
Birinci sıradaki array double değerler alan 564 öğeye sahiptir. Görüldüğü gibi, basit bir deyimle 564 tane değişken birden tanımlanabilmektedir. Program işlerken, bunların her birisine ana bellekte birer yer ayrılacaktır.
İkinci sıradaki array değerleri harfler olan 20 değişken tanımlamaktadır. Bu türler, özellikle string
(metin, karakter dizini) yaratma yöntemini de teţkil eder. Bu konu daha ayrıntılı olarak ileride incelenecektir.Üçüncü sırada liste adlı array'in kaç tane öğeye sahip olduğu [ ] içindeki adet ile belirli olmalıdır; yani adet değişkeni daha önce tanımlanmış ve kendisine uygun değer adanmış olmalıdır.
Dördüncü sıradaki deyim oda adlı
bir pointer bildirmektedir. Bu pointer 8 öğeli bir array'dir. Herbir öğe int değer almaktadır.Beşinci sıradaki bildirim
fonk adlı bir pointer tanımlamaktadır. Bu pointer 5 öğeli bir array'dir. Buradaki fonksiyonlar, önceden tanıtılmış olmalıdır.Array'lerin pointer'ler ile yakın ilişkisi vardir. C dili bütün array bildirimlerini pointer'lere çevirir ve onlara pointer muamelesi yapar.
Array'in başladığı bellek adresi o
array'in ilk öğesinin bulunduğu adrestir. Bu nedenle, damga belirtilmeden Array adı yazılırsa, array'in başlangıç adresi işaret edilmiş olur. Örneğin (2) bildirimindepuan
ile
&puan[0]
aynı değerlidir; her ikisi de puan adlı array'in başladığı bellek adresini gösterir.
Benzer şekilde, * operatörü (içerik operatörü) kullanılırsa
*puan
ve
puan[0]
değerleri aynı olacaktır.
Array kullanırken, array'in adı ile herhangi bir öğesinin çok farklı olduğunu hiç unutmamak gerekir. Örneğin,
char ţirket[ ] = "MicroBil TAŢ" ;
bildiriminde şirket char türünden bir pointer'dir. Dolayısıyla bir karakterin adresini belirtir. Daha açıkçası, şirket , 'M' harfinin bulunduğu bellek adresini gösteren bir pointerdir. Dolayısıyla,
ţirket[0] == *ţirket ;
deyimi doğrudur.
C dili array damgalarınin doğru girilip girilmediğini denetlemez
(**) Bu nedenle programın yürütülmesi daha hızlıdır. Ancak programcı değerlerin doğru adandığından emin olmalıdır.Bazı C derleyicileri (2) ye benzer söz diziminlerinde, array dizinindeki öğe sayısı ile { } içindeki değerlerin sayısı eşit değilse, değer adama işlemini kabul etmez; yanlış adama yapıldığı mesajini verir. Bazı derleyiciler ise, eşitliğin sol ve sağındakileri baştan başlayarak sırayla birbirine eşler; sol taraf erken biterse sağ yanda kalan fazla değerleri yok sayar; sağ yan erken biterse, sol yanda geri kalanlara 0 değe
rini adar.
Örnek
static float fiyat[3] = {23.2, 17.1, 25.6, 39.5, 6.4};
deyiminde static float türünden fiyat adlı 3 öğeli bir array yaratılmıştır. Sağ yanda, bu dizinin öğelerine adanmak üzere 5 tane değer sıralanmıştır. Dolayısıyla, bazı derleyiciler bu deyimi kabul etmeyebilir. Bazı derleyiciler ise, bu deyim sonunda şu konumları yapmış olur:
fiyat[0] = 23.2 ;
fiyat[1] = 17.1 ;
fiyat[2] = 25.6 ;
Bu durumda { } içindeki değerlerden son ikisi; yani 39.5 ile 6.4 değerleri kullanılmamaktadır.
Bazen bu durumun tersi de olabilir; array'in öğe sayısı sağ yandaki { } parantez içinde adanmak üzere sıralanan değerlerden daha çok olabilir.
Örnek
char marka[7] = {'F', 'O', 'R', 'D'};
deyimi yürütüldüğnde yapılan konumlar şöyle olacaktır:
marka[0] = 'F' ;
marka[1] = 'O' ;
marka[2] = 'R' ;
marka[3] = 'D' ;
marka[4] = ' ' ;
marka[5] = ' ' ;
marka[6] = ' ' ;
šyi bir programcı, yazdığı programın her C derleyicisine uymasını sağlamak istiyecektir. Bu nedenle, array'in tanımlandığı yerde adama yapmak gerekiyorsa, array öğelerinin sayısı ile verilecek değerleri denk getirmek iyi bir alışkanlıktır. Değilse, programcı kullandığı derleyicinin, bu sayıların eşitsizliği durumunda ne yaptığını deneyerek görmeli ya da ,varsa, derleyicinin özeliklerini açıklayan başvuru kitabında
n öğrenmelidir.ARRAY'LERE DEĞER ADAMAK
Bir C programinda yaratılan bir array'in öğelerine, yukarıda yapıldığı gibi array'in yaratıldığı anda değerleri adanabilir. Doğal olarak bu yöntem her zaman uygun olmayabilir. Çoğu kez, programcı, programı yürürken ortaya çıkan ya da gerekseme duyulan değerlerin adanmasını isteyecektir. C dilinde array'in öğeleri birer değişken olduğuna göre, öteki değişkenlerle yapılabilen bütün işlerin array öğeleriyle de yapılabimesi beklenir ve yapılabilir.
Örnek
int x[10] ;
bildirimi yapılmış olşun. 10 öğeli bu diziye ait bir öğeye değer adamak için öteki değişkenlere uygulanan yöntemler uygulanabilir:
x[4] = 32 ;
konumu array'in beşinci öğesine 32 değerini verir. Bunun yerine
for(i=0; i<10; i++)
x[i]= 10 -i;
deyimi şu konumları yapmış olur:
x[0] = 10 ;
x[1]= 9 ;
x[2]= 8 ;
x[3]= 7 ;
x[4]= 6 ;
x[5]= 5 ;
x[6]= 4 ;
x[7]= 3 ;
x[8]= 2 ;
x[9]= 1 ;
Aynı konumları array'i tanımlarken yapmak istersek şu deyimi yazmalıyız:
int x[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1 } ;
Bazı derl
eyicilerint x[ ] ;
gibi, öğe sayısı belirtmeyen bir array bildirimini kabul eder. Bu tür array'ler NULL olarak bilinir; bunlar için bellekte bir yer ayrılmaz. Dolayısıyla, kendilerinden sonra tanımlanan değişken ile aynı adreste görünürler.
Örnek
int liste[];
int y[3] = { 45, 87, 25 } ;
bildirimi yapılmışsa
y == liste ;
deyimi doğrudur. Dolayısıyla
liste[0] == 45 ve *liste == 45 ;
olacaktır.