Ünite 7: Diziler, Göstericiler ve Dizgiler

Diziler

C Programlamada diziler, aynı tipte olan birbirleri ile ilişkili verilerin veya değişkenlerin belli bir indis sırasına göre tek bir değişken adı altında bir arada tutulmasını sağlayan yapılardır. Kodlama ihtiyacına göre, program kodunun çalıştırılmasından itibaren işlem yapılacak veri listesinin belli bir sıraya göre düzenli bir şekilde hafızada tutulmasını ve erişilmesini sağlarlar.

Dizi Tanımlama

Dizi tanımlanırken genel ifade,

tip dizi_adı[ BOYUT] ;

şeklindedir. tip ifadesi int, char, float, double vb. değişken türlerinden herhangi birisi olabilir. Köşeli parantez [ ] ifadesi içerisinde belirtilen, BOYUT ise dizi içerisinde saklanacak, işlem yapılacak olan toplam veri sayısı olup, tanımlanan dizinin genel kapasitesini-boyutunu ifade eder. Buna göre, int k[5] ifadesi, tam sayı türünde 5 elemanlı k adında bir dizi tanımlar.

Dizilerde dikkat edilmesi gereken önemli bir nokta, BOYUT kadar elemana sahip bir dizinin ilk elemanının indisi 0 (sıfır) ile başlamasından dolayı, dizinin son elemanının indis değeri sayısal olarak BOYUT-1 olmaktadır. int k[5] ; örneğimizde, ilk eleman k[0] olmakla birlikte, elemanlar k[1], k[2], k[3] şeklinde devam ederek sonuncu, yani dördüncü eleman ise k[4] nolu dizi elemanı olacaktır.

Dizilere Değer Atama

Bir dizi int k[5] ; şeklinde yalnızca isim ve kapasite olarak tanımlandığında, hafızada yalnızca ona ait bir yer tahsis edilmiş olur. Ancak dizi elemanlarına bir değer ataması yapılmaz. Bu nedenle dizinin kapasitesine göre içindeki verilerin sıfırlanması veya atanacak değeri belirlemek amacıyla ilave olarak kodlamaya gereksinim duyulmaktadır. Daha sonraki satırlarda hataya sebep olmaması açısından, genellikle, dizi tanımlanmasının hemen ardından değer sıfırlama ya da yeni değer atama işlemini mutlaka yapmak gerekir.

Dizilerin boyut bilgilerinde kullanılabilecek ve programlamada büyük esneklik sağlayan bir diğer yapı # define ifadesidir. Main fonksiyonundan önce önişlemce tanımları bölümünde kullanılan bu yapı önişlemce komutudur.

#define BOYUT 5 ifadesi, sembolik sabit olan BOYUT ’un değerinin 5 olduğunu belir- tir. Önişlemce tarafından, kodun derleme işleminden önce dikkate alınarak BOYUT yazan her yere 5 ifadesini yerleştiren bir tanımdır.

Kodlar yazılırken pratik olarak değişim gerekli olduğunda, dizilerin maksimum boyutları(kapasiteleri) gibi değişebilir değerlerde genel ifadeler kullanmak büyük kolaylık sağlayacaktır. Örneğin kod ilk yazıldığında ve çalıştırıldığında, içinde tanımlanan dizinin 100 elemana sahip olması yeterli iken, daha sonraki kod güncellemelerinde dizi elemanının kapasitesinin 1000’e çıkarılması gerekirse, dizi boyutunun kullanıldığı her yerde 100 sayısının 1000 sayısı ile ayrı ayrı değiştirilmesi gerekecektir. Bu değişikliğin yerine # define BOYUT 1000 ifadesi ile bu işlem çok daha pratik bir şekilde, tek bir satırdaki değişiklikle gerçekleştirilebilmektedir. # define BOYUT 100 ifadesindeki, 100 değerini 1000 sayısı ile değiştirmek yeterli olacaktır.

Dizi tanımlamalarında üzerinde durulması gerekli bir diğer önemli durum ise, aynı anda, aynı türden birden fazla dizi tanımlamasıdır. Bu durumla ilgili olarak, çoklu değişken tanımlamada da geçerli olan kurallar diziler için de geçerli olup her yeni dizi birbirinden virgül işareti “,” ile ayrılarak tanımlanmaktadır.

Örnek olarak, “int k[5], not[50] ; ” şeklindeki tanımlamada tam sayı türünden, bir- birinden bağımsız içeriklere sahip, 5 elemanlı k ve 50 elemanlı not dizileri aynı satırda tanımlanabilmektedir.

Dizi elemanlarına değer atanmasında kullanılan bir diğer yöntem ise, ilk olarak dizi tanımlaması yapılırken, süslü parantezlerin {, } kullanılmasıdır. Örneğin arasinav1 adında 5 tane değere sahip bir dizinin eleman değerleri önceden biliniyorsa, doğrudan atanmak istendiğinde,

int arasinav1[5]={50, 80, 60, 90, 70}; şeklinde belirtilebilir.

İki ve Üç Boyutlu Diziler

İki boyutlu diziler, tek boyutlu dizilerden farklı olarak birden fazla satır ve sütunlardan oluşan tablolardır. Diğer bir ifade ile, Şekil 7.1 de gösterildiği şekilde hücrelerden oluşan yapılardır. Şekil 7.1 de hem tek boyutlu hem de iki boyutlu dizi gösterimi bulunmaktadır. Aynı kapasiteeleman sayısına sahip, tek boyutlu ve iki boyutlu diziler kapasite açısından karşılaştırılırsa, tek boyutlu bir dizinin elemanlarının dizilimi 1xmxn şeklinde iken, iki boyutlu dizinin elemanlarının dizilimi ise mxn şeklindedir.

Tek boyutlu dizilerde indis değerleri tek bir yönde birer birer artarken, iki boyutlu dizilerde iki yönde de indis değerleri değişmektedir. Böylece, iki boyutlu bir dizideki bir elemanın içeriğine erişmek için hangi satır ve sütun değerine sahip ise, iki boyutlu bir düzlemdeki bir koordinat şeklinde; dikeyde y, yatayda x bir değişken gibi kabul edilir ise, b[y][x] şeklinde, x ve y indis değerleri ile ulaşılır. Dizinin satır ve sütun için ilk indis değeri tek boyutlu dizilerde olduğu gibi yine 0’dan başlamaktadır. m satır, n sütun sayısı olmak üzere, mxn’ lik bir dizinin m*n adet farklı değere sahip eleman sayısı mevcuttur. Her satır- da, sonuncu eleman b[y][n-1]. , her sütunda sonuncu eleman b[m-1][x] . elemandır.

Çok boyutlu dizilerin tanımlanması, ilk değer ataması, tek boyutlu dizilerle benzerlikler taşımaktadır. Ancak iki boyutlu dizilerin elemanlarına erişiminde yineleme kullanımında, indis elemanlarına ulaşmak için, satır ve sütun için birbirinden farklı sayaç-indis değerleri kullanmak gerekir.

İki boyutlu dizilerin katmanlar hâlinde bir araya gelmesiyle oluşan 3 boyutlu diziler de öncekiler gibi aynı özelliklere sahiptir. Verilerin daha düzenli bir şekilde bir arada tutulmasını sağlarlar. Örnek 7.5’te tanımlanan matematik ve turkce dizileri 3 boyutlu bir dizide bir arada toplanmak istenirse, dersler adında bir dizi tanımlanıp, matematik dizisi dersler dizisinin 3. boyuttaki 0. indisinde, turkce dizisi ise 3. boyuttaki 1. indisinde yer alabilir. Şekil 7.3’te, 2 boyutlu dizilerin bir araya getirilerek oluşturulduğu 3 boyutlu dizi yapısına ait bir çizim yer almaktadır. Dersler dizisinin elemanlarına dersler[y][x][z] şeklinde ulaşılacaktır. x ve y ile ulaşılan ilk 2 boyut iki boyutlu dizilerle aynı kullanım şekline sahiptir. Tek fark z ile gösterilen kaçıncı katman olduğunu gösteren değişkendir. 3 boyut yer aldığı için, elemanlar arasında gezinmek için iç içe 3 adet for yinelemesi kullanılabilir.

Aşağıda yer alan Örnek 7.6’da 3×2 lik dizilerin 2 katman hâlinde bir araya gelerek 3 boyutlu bir dizi oluşturulması ile ilgili örnek bir program kodu yer almaktadır. Örnek kodun program çıktısında dizideki elemanların dizilimi gösterilmektedir.

Göstericiler

C Programlamada tanımlanan değişkenler, tiplerine göre bellekte değişik byte uzunluklarında alanlar kaplamaktadırlar. Normal değişkenler içeriklerinde programlarda kullanılacak değişkenlerin sayısal değerini içerirken, göstericiler bağlantıda olduğu değişkenlerin adreslerini içerirler. Böylece dolaylı olarak değişkenlere ulaşmayı sağlarlar. Göstericiler, programda fonksiyonlar arasında aynı anda birden fazla değişken aktarımı gibi işlemlerde oldukça büyük kolaylık sağlayan yapılardır.

Gösterici Tanımlama

Göstericiler (İngilizce ifadesi: pointerlar) programlarda kullanımlarından önce tanımlanmaları gerekmektedir. Gösterici bildiriminde, normal değişken bildiriminden farklı olarak, gösterici adı önünde ‘*’ karakteri kullanılmaktadır.

tip * degisken_adı;

şeklinde tanımlanmaktadır. tip değişkenler için de kullanılan int, oat, char vb. türlerinden herhangi birisi olabilir. Ancak dikkat edilmesi gereken nokta, gösterici ile göstericiye bellek adresi atanacak değişkenin veri tipi aynı olmalıdır.

Göstericilerin Dizilerle Birlikte Kullanılması

Göstericiler değişkenlerin başlangıç adresini belirtmeleri dolayısı ile dizilerle benzer özellikleri içermektedirler. Dizilerin ilk elemanlarını göstericilerle belirterek, dizilergöstericiler birbirlerinin yerine kullanılabilirler.

Dizgiler

C programlama dilinde, dizgiler için tanımlanmış bir veri tipi bulunmamaktadır. Dizgi-er karakterlerden oluşan diziler veya göstericiler olarak tanımlanabilir. Bu nedenle, dizgi tanımlarında tek boyutlu diziler tanımlanmaktadır. Normal dizilerden farklı olarak son elemanı NULL(0) (‘’) değeri ile sonlandırılmaktadır. Bu özelliklerinden dolayı karakter dizilerini, dizginin içereceği karakter sayısından bir karakter fazla kapasiteli olacak şekilde tanımlamak gerekmektedir.

char d[10]; şeklindeki bir dizgi tanımlamasında, dizginin d[9] indis nolu elemanı NULL değere sahiptir. Bu durumda d dizgisine 9 karakterli bir kelime yazılabilir. d dizgisi içerisindeki karakterler hafızada okunurken NULL’ a kadar okunur, NULL bir sınır değeri oluşturur.

char ad[] = “neslihan”;

tanımlamasında 8 adet karakter içerilmektedir. Dizi boyutu verilmemiştir. Bu nedenle NULL karakteri de dahil olmak üzere toplamda 9 karakter kapasitesine sahip bir karakter dizisi yani dizgi tanımlanmıştır. Sırasıyla ‘n’, ‘e’, ‘s’, ‘l’, ‘i’, ‘h’, ‘a’, ‘n’, ‘’ karakterlerini içeren ad dizgisinin ilk elemanı olan a d [0] ‘n’, 7 indis nolu ad[7] elemanı ise yine ‘n’ harfini içermektedir. ad[8] nolu elemanı ise kelime sonu anlamına gelen ‘ ’ NULL karakterini içerir. Yukarıdaki örnek başka bir gösterim ile,

char ad [ ]={‘n’, ‘e’, ‘s’, ‘l’, ‘i’, ‘h’, ‘a’, ‘n’, ‘’};

şeklinde de tanımlanabilmektedir. Ancak bu tanımlama şeklinde en sonda yer alan ‘’ karakteri eklenmeye unutulmamalıdır. Bir önceki tanımlamada bu NULL karakter otomatik olarak sona eklenirken, süslü parantez gösteriminde, kodlamayı yapanın manuel olarak en sona eklemesi gerekmektedir. ‘’ karakterinden dolayı dizgilerin boyutu bir fazla olarak belirlenmelidir.

Dizgileri tanımlarken belirlenen dizgi kapasitesi (karakter sayısı) daha sonra bu diz- giye atama yapılması esnasında aşılırsa, diğer bir ifade ile daha uzun bir kelime atanması durumunda hafızada dizginin devamında yer alan bölüme taşmaya sebep olacağından o bölümdeki verilerde kayıplara sebep olacaktır.