Şimdi C kodu üzerinde konuşuyoruz, değil mi?
int dizimiz [4][5] = { {0, 1, 2, 3, 4},
{5, 6, 7, 8, 9},
{0, 1, 2, 3, 4},
{5, 6, 7, 8, 9} };
int (* dizi) [5] = dizimiz;
// ...
* (* (dizi + satir) + sutun)
dizimiz'in türü: Her birisi 5 int'lik 4 diziden oluşan dizi.
dizi'nin türü: 5 int'lik dizi göstergesi.
dizi+satir: dizi'nin satir kadar sonrasındaki dizi. Örneğin dizi+1 {5, 6, 7, 8, 9} dizisini gösterir.
*(dizi+satir): dizi+satir göstergesinin gösterdiği dizi. Örneğin {5, 6, 7, 8, 9} dizisinin kendisi.
*(dizi+satir)+sutun: Derleyici düşünür: Bir diziye bir tamsayı ekleniyor. Garip. Anlaşılan diziyi bir gösterge gibi kullanmak istiyorlar. O zaman şu kuralı uygulayayım: Dizinin kendisi yerine, ilk elemanı gösteren gösterge olarak davranayım. Örneğin sutun==2 olduğunda *(dizi+satir)+sutun, 7 değerli int'i gösteren bir göstergedir.
((dizi+satir)+sutun): Yukarıdaki göstergenin gösterdiği int. Yani örneğin 7 değerli eleman.
Senin son gösterdiğin kod da aynı sonucu verir ama bir farkla: Yukarıda derleyicinin garip bularak yardımcı olduğu kural sen diziyi ilklerken uygulanır:
Alıntı (Salih Dinçer):
> Hmm anladım, peki o satırın eşdeğeri şu olabilir mi? Çünkü aynı sonucu veriyor...
Alıntı ("C KODU"):
>
> > int * dizi[4];
> >
> > dizi[0] = dizimiz[0];
> > dizi[1] = dizimiz[1];
> > dizi[2] = dizimiz[2];
> > dizi[3] = dizimiz[3];
> > ```
> >
>
dizi[0] bir int göstergesi. Ona dizimiz[0] diye bir dizi eşitlemeye çalışıyoruz. Türleri aynı değil. O zaman derleyici "diziyi ilk elemanını gösteren gösterge" olarak kullanıyor ve dizi[0]'a dizimiz[0]'ın ilk elemanının adresini atıyor. Yukarıdaki incelemeyi onun için de yapabiliriz:
dizi+satir: dizi bir dizi olduğu halde ona bir gösterge gibi davranılıyor. O zaman dizi, ilk elemanının adresi yerine geçecek. İlk elemanı bir int* olduğuna göre ilk elemanının adresi int**'dir. Örneğin dizi+1 {5, 6, 7, 8, 9} dizisinin ilk elemanını gösteren göstergedir. (Hocam bunlar çok karışık konular. :))
*(dizi+satir): dizi+satir göstergesinin göstergesinin gösterdiğidir. Yani {5, 6, 7, 8, 9} dizisinin ilk elemanı gösterilmektedir.
*(dizi+satir)+sutun: {5, 6, 7, 8, 9} dizisinin sutun'uncu elemanı gösterilmektedir.
*(*(dizi+satir)+sutun): Yukarıdaki göstergenin gösterdiği int'tir. Yani 7.
Umarım doğrudur. Bunları biraz olsun printf ile yazdırmaya çalışarak anlayabiliyoruz:
printf("%d", dizi);
Hata mesajı bize dizi'nin türünü söylüyor:
'error: format ‘%d’ expects type ‘int’, but argument 2 has type ‘int **’'
Ali
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]