Standart C Programlama Dili


5.8.2. Dizilere Göstergeler

Daha önce de açıklandığı gibi, bir fonksiyon parametresi olarak tanımlanmış tek boyutlu bir dizinin boyunun belirtilmesine gerek yoktur, çünkü bu bir dizi değil, gerçekte bir göstergedir. Çok-boyutlu bir dizide ne olur? Kural şöyledir: İlki dışında bütün boyutların boyunu belirtmeniz gerekir. Örneğin,

f (int uc_b[][5][7])
{ ... }

Gelin bunun nedenine bakalım. uc_b[0]’ın 5×7 boyunda iki-boyutlu bir dizi olduğuna dikkat edin, uc_b[1] ilkinden 35 int ileride olan bir sonraki iki-boyutlu dizidir. Yani, uc_b[1] veya *(uc_b+1)—bir gösterge ifadesi—uc_b[0]’ın 35 int ilerisini göstermelidir. Bu, uc_b’nin 5 çarpı 7 (yani 35) elemanlık bir diziye gösterge olduğu anlamına gelir. Yukarıdaki parametre bildirimi şöyle de yazılabilirdi:

int (*uc_b)[5][7];

bu da yukarıdaki ile tamamen aynıdır. Parantezlere dikkat edin. Eğer yazılmasalardı,

int *(uc_b[5][7]);

anlamına gelecek, bu da int göstergelerden oluşan iki-boyutlu bir dizi anlamına gelecekti; bir sonraki altkısmın konusu.

Aşağıdaki örnek çok-boyutlu dizilerin kullanımını özetlemeye çalışmaktadır. Programı inceleyip, onu izleyen çıktıyı doğrulamaya çalışın.

#include <stdio.h>

int  x[3][5][7];      /* uc-boyutlu bir dizi */

void f
  (int a[][5][7])     /* iki-boyutlu diziye gösterge */
{
  printf("%d\t%d\n", a[0][0][0],
    (int)sizeof a[0][0][0]);
  printf("%d\t%d\n", a[0][0], (int)sizeof a[0][0]);
  printf("%d\t%d\n", a[0], (int)sizeof a[0]);
  printf("%d\t%d\n", a, (int)sizeof a);
  printf("\n%d\t%d\n", x[0][0][0],
    (int)sizeof x[0][0][0]);
  printf("%d\t%d\n", x[0][0], (int)sizeof x[0][0]);
  printf("%d\t%d\n", x[0], (int)sizeof x[0]);
  printf("%d\t%d\n", x, (int)sizeof x);
  printf("\n%d\t%d\t%d", (int)a[0], (int)a[1],
    ((int)a[1]-(int)a[0]) / (int)sizeof(int));
  printf("\n%d\t%d\t%d", (int)x[0], (int)x[1],
    ((int)x[1]-(int)x[0]) / (int)sizeof(int));
  printf("\n%d\t%d\t%d", (int)a[0][0], (int)a[0][1],
    ((int)a[0][1]-(int)a[0][0]) / (int)sizeof(int));
  printf("\n%d\t%d\t%d", (int)x[0][0], (int)x[0][1],
    ((int)x[0][1]-(int)x[0][0]) / (int)sizeof(int));
}

int main (void)
{  f(x); return 0; }

Çıktı şöyledir:

0       2
3384    14
3384    70
3384    2

0       2
3384    14
3384    70
3384    210

3384    3454    35
3384    3454    35
3384    3398    7
3384    3398    7