
Array(Dizi) hafızada sıralı bir şekilde tutulan aynı türden olan elemanların toplusudur desek yanılmayız.

Resimde görüldüğü üzere, array'ler bellekte şu şekilde saklanır. Önemli bir bilgi de şudur ki, array'in ilk elemanı 0. indekste tutulur ve böyle devam eder.
Aşağıdaki resim, bu konuya güzel bir gerçek hayat örneği sunabilir.

Bu örneği vermemin amacı, aslında anlatmak istediğim konuya daha iyi odaklanabilmemize olanak sağlamaktı. Array'ler, aynı türden olan elemanlarla bellekte sıralı bir şekilde dizilir. Şimdi, bu konuyu daha iyi anlatabilmek adına bir örnek kullanalım. Bu bir yumurta kabıdır ve sadece yumurta konulur. Yumurta kabına ben domates koymaya çalışırsam, bu pek mümkün olmaz çünkü yumurta ve domates aynı türden değildir. İşte array'ler de benzer şekilde, aynı türde elemanlardan oluşmak zorundadır.
Başka bir konuya geçelim: Array'lerin boyutu. Array'lerin boyutunu derleme zamanında belirleriz ve çalışma zamanında değiştiremeyiz. Örneğin, 10 elemanlı bir array belirlediysek, 11. elemanı ekleyemeyiz; aksi takdirde bir indeks hatası alırız. Bu nedenle, gerekli alanı önceden belirlememiz gerekmektedir.
Yine aynı örneği kullanarak açıklayalım: Yumurta kabı. Bu kabın içine 16 yumurta sığar (şu an için 16 olarak devam edelim). Ancak, 17. yumurtayı ekleyemezsiniz çünkü kabı üreten fabrika önceden bu boyutu 16 olarak belirlemiştir ve daha sonra değiştirilemez.
Yine aynı örneği kullanarak açıklayalım: Index nedir aslında index arrayın içinde olan elemanları bize vermek,ulştırmak için gerken bir özellik. mesela ben desem ki yukardaki kabda bana 2. yumurtayı ver sen 2. yumurtanı bana vericeksin işte index de bunun gibi.
Şimdi array nedir konusunu az çok anladığımıza göre, kod aşamasına geçebiliriz.
public static void main(String ...args){
int numbers[]=new int[10];//
String []strs=new String[10];
numbers[0]=1;//ok
numbers[2]=2;//ok
numbers[3]="de";//x
numbers[4]="c";//x
strs[0]="Sarvar";
strs[1]="Engineer";
strs[2]=12;
}
Şimdi yukarıda iki dizi oluşturdum ve eleman ekledim, ancak bazı hatalar yaptım. İlk olarak, bir Integer dizisi oluşturdum, boyutunu belirledim ve 2 adet int türünden eleman ekledim. Ancak, sonradan iki tane daha eklemeye çalıştım. Peki, bu doğru mu?
Hayır, son iki eklediğim eleman String türünden ve bu nedenle derleme zamanında bir hata alacağız. Aynı şekilde, ikinci dizide de 2. indekse eleman ekledim, ancak bu eleman da String türünde değil. Dolayısıyla, burada da bir hata bulunmaktadır.

Burada bellekte bir Integer array'ın nasıl tutulduğunu görebiliyoruz. İşte bunu nasıl bildiğimi soracak olursanız, her bir elemanın 4 byte yer kaplaması nedeniyle Integer olduğunu anlayabiliyoruz.
public class ArrayExample {
public static void main(String[] args) {
// Bir dizi oluşturma
int[] myArray = {1, 2, 3, 4, 5};
System.out.println("Dizi Elemanları:");
// for döngüsü ile dizi elemanlarını yazdırma
for (int i = 0; i < myArray.length; i++) {
System.out.println("Index " + i + ": " + myArray[i]);
}
}
}
Şimdi düşünebilirsiniz ki, index ile erişmenin veya array'in türünü belirtmenin neden önemli olduğu konusunu anlayalım ve bu konudaki faydaları görelim.
Hadi hesaplayalım:
Başlangıç adresimiz 1024. İlk elemana erişeceğiz: 1024+4×0=1024. Bu durumda, 1024 adresine bakar ve orada 1 olduğunu görür, bu şekilde devam eder.
1024+4×0=1024
Başlangıç adresimiz hala 1024. İkinci elemana erişeceğiz (yani 1. indeks): 1024+4×1=1028. Adrese baktığında orada 2 olduğunu görür.
1024+4×1=1028
Bu hesaplamalarla bellekteki ilgili elemanlara doğru şekilde erişebiliyoruz.
Yani arkasında yatan hesaplama işlemi şu şekilde ifade edilebilir: İşte burada verinin tipi önemlidir çünkü başlangıç adresini biliyoruz ve her bir elemana erişmek için adım büyüklüğünü (veri tipi boyutu) bilmemiz gerekiyor. Bu bilgi sayesinde, bir sonraki elemana geçmek için kaç adım atacağımızı önceden biliyoruz. Bu nedenle, veri tipi bilgisi, bellekteki verilere düzgün bir şekilde erişim için kritik bir öneme sahiptir.
Burada ise C kodu ile arkada olan işlemi simule etmeye çalıştım.
#include <stdio.h>
int main() {
// Bir dizi oluşturma
int myArray[] = {10, 20, 30, 40, 50};
size_t size = sizeof(myArray) / sizeof(myArray[0]);
for(int i = 0 ; i < size; i++){
int *elemanAdresi = (int*)((char*)&myArray + sizeof(int) * index);
printf("Dizinin %d. indeksindeki eleman: %d\n", index, *elemanAdresi);
}
return 0;
}
Bu örnekte, elemanAdresi'ni belirlemek için bir dizi elemanının adresini hesaplamak için cast işlemleri kullanılmıştır. İlk olarak, &myArray ifadesi, myArray'nin adresini alır. Bu adres, int türünden bir değişkenin adresidir.
Sonra, bu adres üzerinde işaretçi aritmetiği uygulanır. sizeof(int) * index ifadesi, belirli bir indeksin adresine ulaşmak için kullanılır. Bu ifade, index kadar int türünden bellek bloğu büyüklüğü kadar ileri gitmeyi sağlar.
Ancak, burada dikkat edilmesi gereken önemli bir nokta var. C dilinde, tür dönüşümleri ile ilgili olarak uyarılar alınabilecek bir durum söz konusudur. Yukarıdaki örnekte, (char*) ile myArray'nin adresini bir karakter işaretçisine dönüştürüyoruz. Bu, daha sonra işaretçi aritmetiği ile belirli bir indeksi temsil ederken, tür uyumsuzluğunu ortadan kaldırmak için yapılmış bir dönüşümdür. sizeof(char) genellikle 1 olduğu için, sizeof(int) * index ifadesi, index kadar int türünden bellek bloğu büyüklüğü kadar ileri gitmeyi sağlar.
Burada hangi tipin kaç byte olduğunu göre bilirsiniz.

Loading comments...