Bir dizi (array), bir veya daha fazla boyutta indekslenebilecek şekilde düzenlenmiş veri elemanları koleksiyonudur ve C++ dilinde bu elemanlar bellekte ardışık (contiguous) olarak depolanır. Yazılım geliştirme süreçlerinde, aynı veri tipine sahip yüzlerce veya binlerce değişkeni tek tek tanımlamak yerine, hepsini tek bir çatı altında toplamak için diziler kullanılır. Genel anlamda C++’ta dizilerin kullanımı C dili ile büyük ölçüde benzerlik gösterir.
Bu rehberde, C++ dilinde tek boyutlu dizilerin (one-dimensional arrays) ne olduğunu, bellekte nasıl tutulduğunu, işaretçilerle (pointers) olan güçlü ilişkisini ve dinamik bellek tahsisini adım adım öğreneceksiniz.
1. Tek Boyutlu Dizi (Array) Tanımlama ve İlk Değer Atama
C++ dilinde bir dizi tanımlamak için öncelikle dizide tutulacak elemanların veri tipini, ardından dizinin adını ve köşeli parantezler [] içerisinde dizinin kapasitesini belirtmeniz gerekir.
Örnek Dizi Tanımlama (Kaynak dışı pekiştirme örneği):
int ogrenciNotlari; // 5 adet tam sayı tutabilen bir dizi
Dizilere oluşturuldukları anda ilk değerlerini atamak (initialization) da mümkündür. Süslü parantezler {} kullanılarak dizinin elemanları başlangıçta belirlenebilir:
int sayilar = {10, 20, 30, 40, 50};
2. İndeksleme (Indexing) ve Elemanlara Erişim
Dizinin içindeki belirli bir elemanı seçmek veya değiştirmek için indeks (index) adı verilen bir değer, değişken veya ifade kullanılır. Programlama dünyasındaki en temel kurallardan biri C++ için de geçerlidir: Dizilerin indeksleri her zaman 0’dan başlar.
Yukarıdaki sayilar dizisini ele alırsak:
- İlk elemana erişim:
sayilar(Değeri 10’dur) - İkinci elemana erişim:
sayilar(Değeri 20’dir) - Son elemana erişim:
sayilar(Değeri 50’dir)
3. C++’ta Dizi Sınırları ve Güvenlik (Array Bounds Checking)
C++ dilinin tasarım felsefesinde performans ve hız her şeyden önce gelir. Bu yüksek performansın bir sonucu olarak, derleyici tarafından dizi sınırlarının (array bounds) aşılıp aşılmadığına dair otomatik bir hata kontrolü yapılmaz.
Örneğin, 25 elemanlı bir dizi tanımladığınızı varsayalım; eğer programınız çalışırken dizinin 26. konumuna erişmeye veya oraya veri yazmaya kalkışırsanız, derleyici size herhangi bir uyarı vermez. Bu işlem sonucunda bellekte dizinin sınırları dışına taşılmış olur ve bu durum programın aniden çökmesine veya diğer değişkenlerin bozulmasına yol açabilir. C++’ın bu davranışı sisteme büyük bir esneklik kazandırsa da, dizi limitlerini kontrol etme görevi tamamen programcıya aittir.
4. Diziler ve İşaretçiler (Pointers) Arasındaki Ayrılmaz Bağ
C++’ta diziler ve işaretçiler (pointers) arasında son derece özel ve koparılamaz bir ilişki vardır. Öyle ki, dizi elemanlarına ulaşmak için işaretçileri kullanmak, çoğu zaman doğrudan indeks numaralarını kullanmaktan daha basit ve verimlidir. Ayrıca biz aksini belirtmesek bile, C++ derleyicisi bir dizinin adını bellekte o dizinin ilk elemanını gösteren sabit bir işaretçi (constant pointer) olarak görür ve o şekilde değerlendirir.
İşaretçi aritmetiği kurallarına göre bir işaretçiyi artırmak (increment) veya azaltmak (decrement) mümkündür. Örneğin, ptr isimli bir işaretçi dizinin ilk elemanını işaret ediyorsa, ptr+1 ifadesi bellekteki donanımsal bayt hesaplamalarını otomatik olarak yaparak doğrudan dizinin ikinci elemanını gösterecektir.
(Kaynak dışı pekiştirme örneği):
int dizi = {5, 10, 15};
int *ptr = dizi; // ptr artık dizi'ın adresini tutuyor.
// ptr+1 ifadesi doğrudan dizi olan 10 değerini işaret eder.
5. Karakter Dizileri (C-Strings) İçin Özel Kurallar
Uygulamalarınızda metin (string) verilerini saklamak için char veri tipinde karakter dizileri kullanabilirsiniz. C++ dilinde char tipindeki bir dizinin adı, aslında o metnin (string’in) ilk karakterinin bellek adresini içerir.
Karakter dizileri söz konusu olduğunda C dili ile C++ dilindeki kullanım büyük ölçüde aynı olsa da, diziye ilk değer atanması hususunda çok önemli bir fark mevcuttur. C dilinde bir karakter dizisine metin (string sabiti) atanırken, derleyici dizinin boyutunu tam olarak metnin karakter uzunluğu kadar belirlemenize izin verir. Ancak C++ dilinde, karakter dizisinin boyutu atanacak metnin içerdiği karakter sayısından her zaman en az bir fazla olmalıdır.
Bunun asıl sebebi, C++’ın metinlerin sonunu algılayabilmek için gizli bir şekilde null (\0) karakterini kullanmasıdır. Örnek vermek gerekirse, 3 harfli “xyz” kelimesini bir char dizisine atayacaksanız, dizinin kapasitesi null karakterini de güvenle barındırabilmesi için en az 4 olmalıdır.
6. Dinamik Dizi Oluşturma (Dynamic Memory Allocation)
Bazen bir dizinin kaç elemanlı olacağını derleme zamanında (compile-time) kesin olarak bilemeyebiliriz. Dizinin boyutunun program çalışırken (run-time) kullanıcıdan alınacak veriye göre belirlenmesi gerekebilir. C dilinde bu bellek ayırma işlemi karmaşık malloc() veya calloc() fonksiyonlarıyla yapılırken, C++ dili bize belleği dinamik olarak tahsis etmek (allocate) ve iade etmek (free) için oldukça yetenekli olan new ve delete operatörlerini sunar.
Tek boyutlu bir diziyi belleğin boş depo (free store) alanında dinamik olarak oluşturmanın genel sözdizimi (syntax) şöyledir: pointer-variable = new data-type [size];
Burada size, dizideki eleman sayısını belirtmek için kullanılır. Örneğin, aşağıdaki kod satırı 10 tam sayılık (integer) bir bellek alanı oluşturur ve bu alanın başlangıç adresini p işaretçisine atar: int *p = new int;
Dinamik olarak tahsis edilen bu hafızayla işimiz bittiğinde, bellek sızıntılarını (memory leak) engellemek adına diziyi işletim sistemine iade etmemiz şarttır. Dinamik bir diziyi tamamen silmek için delete operatörü şu şekilde kullanılmalıdır: delete [] pointer-variable;
Köşeli parantezler [], derleyiciye o işaretçinin sadece tek bir veri parçasını değil, peşi sıra gelen bir diziyi gösterdiğini ve dizinin tümünün bellekten silinmesi gerektiğini bildirir.
Özetle; C++’ta tek boyutlu diziler, veri koleksiyonlarını yönetmenin en geleneksel ve hızlı yoludur. Derleyicinin diziler üzerinde sınır aşımı kontrolü yapmaması C++ uygulamalarının saniyede milyonlarca işlemi performans kaybı yaşamadan yapmasını sağlar. Donanıma yakın programlama yaparken, dizilerin sabit işaretçiler (constant pointers) olarak ele alınması bellek yönetimi konusunda mühendislere devasa bir kontrol gücü verir. Güvenli, performanslı C++ projeleri inşa etmek için diziler ile işaretçiler arasındaki bu temel bağı mutlaka iyi kavramak gerekmektedir.





