Alıntı (erdem):
>
> #include <stdio.h>
>
> int main()
> {
> 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;
>
> int satir, sutun;
> for (satir = 0; satir < 4; ++satir) {
> for (sutun = 0; sutun < 5; ++sutun) {
> printf("%d", * (* (dizi + satir) + sutun));
> }
> printf("\n");
> }
> }
> ```
>
> Peki benek sayısı artmaya başlayınca da mı ayırarak kullanalım. Örneğin
>
> int ( * dizi) [5] = dizimiz;
> ya da
> printf("%d", * ( * (dizi + satir) + sutun));
> ```
> bu şekilde. Dikkat ederseniz burada boşlukları bir arttırdım. Sonra (* dizi) ile [5], dizimizdeki [4] ve [5] gibi bitişik mi olsun.
>
Ne yapmak istediğini anlamak için kodu, şu şekilde D'ye çevirdim:
void main() {
int[][] dizimiz = [ [0, 1, 2, 3, 4],
[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9] ];
int[]*[] dizi = [ &dizimiz[0],
&dizimiz[1],
&dizimiz[2],
&dizimiz[3] ];
for(int satir = 0; satir < 4; ++satir) {
for(int sutun = 0; sutun < 5; ++sutun) {
printf("%d", *(dizi[satir].ptr + sutun));
}
printf("\n");
}
}
Elbette bunu dilimlerle de yapabilirdik ama madem işaretçi aritmetiği yapacağız öyleyse başka şey karıştırmamalıydık...:)
Verilerinin tanımlandığı ve döngünün kurulduğu üst bölümü yok farz edip asıl satıra odaklanırsak birebir D karşılığı şu olsa gerek:
Alıntı:
>
> printf("%d", *(dizi[satir].ptr + sutun));
Elbette dizi[satir] şeklinde kullanmış olmam da bir fark ama burada .ptr sayesinde bir yıldızdan kurtulmuş olmamız önemli bir fark. Peki aritmetik yapmayıp biraz cimnastik yaparsak başka farklı ne yapabiliriz? Önce .ptr'yi kaldıralım:
Alıntı:
>
> printf("%d", (*dizi[satir])[sutun]);
> ```
Şimdi de yıldızı kaldırıp .ptr'yi koyalım:
Alıntı:
>
> printf("%d", dizi[satir].ptr[sutun]);
Hoş değil mi...:)
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]