Veri Yapıları : Diziler

Diziler aynı türden bir çok öğeyi bitişik bellekte depolayan veri yapısıdır. Depolanan veri aynı türden olduğu için homojen olarak anılır. Dizilerde boyut önceden belirlenir ve belirlenen bu boyut sonradan değiştirilemez. Diziler bellekte sürekli bir biçimde bulunur. Bu nedenle diziye eklenen bir elemanı silmek istediğimiz zaman aslında onun içeriğine farklı bir değer yazmış oluyoruz. Tahsis edilen alanı silemiyoruz.

<İçerik Türü> <Dizi_adı> [<Dizi_boyutu>]; // Bu şekilde dizi bildirimi yapabiliriz.
Örneğin:
int yas[20]; // bu dizi ile 20 adet int türünden veri tutabiliriz.

Dizi elemanlarının bildirimleri sırasında [ ] içerisinde bulunan ifade(yani dizinin boyutu) bir sabit olmak zorundadır. Bildirim işlemleri derleme zamanında ele alındığı için dizi bildirimleri için değişken kullanamayız. Fakat #define önişlemci komutuyla tanımladığımız bir makroyu bildirim işlemlerinde kullanabiliriz. (C++’ta const ifadesi ile tanımlanan bir değişkeni de bildirim işlemlerinde kullanmamız mümkündür.)

#define BOYUT 5
int const diziBoyutu = 10;
char diziConstBildirim[diziBoyutu];//c++'ta geçerli
char diziMakroBildirim[BOYUT];

int main()
{
    printf("%d",sizeof(diziConstBildirim)/sizeof(diziConstBildirim[0]));
    printf("%d",sizeof(diziMakroBildirim)/sizeof(diziMakroBildirim[0]));
    return 0;
}

Dizilere indis numaraları ile direkt erişim yapabiliriz. Dizi oluşturulduğunda, oluşturulan dizi globalse veya static olarak tanımlanan bir yerel değişken ise içerisindeki varsayılan değer ‘0’ dır. Fakat static olmayan bir yerel değişken ise bu dizinin indislerinde garbage(çöp) değerler bulunur.

Şeklinde sizeof operatörü ile dizi için ayrılan boyutu görebiliyoruz. Sizeof, nesnenin veya verinin bellekte kaç byte yer kapladığını gösteren bir operatördür. Yukarıdaki örnekte her bir int 4 byte yer kapladığı için dizimiz toplamda 20×4=80 byte yer kaplamaktadır.

Boyutunu bilmediğimiz bir dizininin boyutunu öğrenmek için sizeof(dizi)/sizeof(dizi[0]) şeklinde bir kod yazabiliriz.

Yazımızın başında bitişik bellek olarak belirttiğimiz durumu göstermek için dizinin her bir indisinin adresini yazdıracağız.


int dizi[] = { 1, 2, 3, 4, 5} şeklinde boyutu belirtilmeden dizi bildirimi yapılabilir ve bildirimi yapılmış bu dizinin boyutu 5’tir. Bu şekilde yapılan ilk değer verme işleminde sırasıyla ilk indise ilk değer, son indise son değer verilir.
Dizi isimleri, dizilerin bellekteki başlangıç adresini gösteren ifadelerdir.

String türü, char türünden oluşan dizi karakterlerinin bir araya gelmesi ile oluşur. Böyle bir durumda karakterlerin ardından “\n” sonlandırıcı karakteri kullanılmalıdır. Sonlandırıcı karakterin kullanımında dizinin uzunluğunu bilmeden ilgili karakter dizisi ile ilgili işlemlerin yapılması amaçlanmıştır. Fakat sonlandırıcı karakterlerin dizi içerisinde yer tutması bir dezavantaj olarak söylenebilir. %s formatıyla \n karakterini görene kadar ekrana çıktı yazabiliriz. Uart gibi seri haberleşme protokollerinde tampon olarak kullanılan değişkenlere veri atarken de \n sorgusu yapılmaktadır.

Diziler birden fazla boyuta sahip olabilirler. Bu şekilde bir matris tanımlamak için

<İçerik Türü> <Dizi_adı> [<Dizi_boyutu>][<Dizi_boyutu>][<Dizi_boyutu>]...

şeklinde tanımlama yapılabilir.