11.4 Gösterici ve Diziler Arasındaki İlişki
11.4 Gösterici ve Diziler Arasındaki İlişki
C dilinde göstericiler ve diziler arasında yakın bir ilişki vardır. Bir dizinin adı, dizinin ilk elemanının adresini saklayan bir göstericidir. Bu yüzden, bir dizinin herhangi bir elemanına gösterici ile de erişilebilir. Örneğin:
1 |
int kutle[5], *p, *q; |
şeklinde bir bildirim yapılsın. Buna göre aşağıda yapılan atamalar geçerlidir:
1 2 3 |
p = &kutle[0]; /* birinci elemanın adresi p göstericisne atandı */ p = kutle; /* birinci elemanın adresi p göstericisne atandı */ q = &kutle[4]; /* son elemanın adresi q göstericisne atandı */ |
İlk iki satırdaki atamalar aynı anlamdadır. Dizi adı bir gösterici olduğu için, doğrudan aynı tipteki bir göstericiye atanabilir. Ayrıca, i bir tamsayı olmak üzere,
1 |
kutle[i]; |
ile
1 |
*(p+i); |
aynı anlamdadır. Bunun sebebi, p göstericisi kutle dizisinin başlangıç adresini tutmuş olmasıdır. p+i işlemi ile i+1. elemanın adresi, ve *(p+i) ile de bu adresteki değer hesaplanır.
NOT
|
Program 11.4’de tanımlanan fonksiyon kendine parameter olarak gelen n elemanlı bir dizinin aritmetik ortlamasını hesaplar.
Program 11.4: Bir dizi ile gösterici arasındaki ilişki
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
/* 10prg04.c: gösterici dizi ilişkisi */ #include <stdio.h> double ortalama(double dizi[], int n); int main() { double a[5] = {1.1, 2.2, 3.3, 4.4, 5.5}; double o; o = ortalama(a,5); printf("Dizinin ortalaması = %lf\n",o); return 0; } double ortalama(double dizi[], int n) { double *p, t=0.0; int i; p = dizi; /* veya p = &dizi[0] */ for(i=0; i<n; i++) t += *(p+i); return (t/n); } |
ÇIKTI
1 |
Dizinin ortalaması = 3.300000 |
20. – 31. satırda tanımlanan fonksiyon aşağıdaki gibi de yazılabilirdi:
1 2 3 4 5 6 7 8 9 |
double ortalama(double dizi[], int n) { double *p, t=0.0; for(p=dizi; p < &dizi[n]; p++) t += *p; return (t/n); } |
Bu fonksiyonda, döngü sayacı için (i değişkeni) kullanılmayıp, döngü içinde dizinin başlangıç adresi p göstericisine atanmış ve koşul kısmında adres karşılaştırılması yapılmıştır. Bu durumda döngü, p‘nin tuttuğu adresten başlar, ve p‘nin adresi dizinin son elemanının adresinden (&dizi[n-1]) küçük veya eşit olduğu sürece çevrim yinelenir.