▃ ▅ ησ ♥ яєѕρєcт ▅ ▃
Süper Üye
Gösterici ve Diziler Arasındaki İlişki
p = kutle; /* birinci elemanın adresi p göstericisne atandı */
q = &kutle[4]; /* son elemanın adresi q göstericisne atandı */
ile
*(p+i);
NOT
01:
02:
03:
04:
05:
06:
07:
08:
09:
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
Dizinin ortalaması = 3.300000
double ortalama(double dizi[], int n)
{
double *p, t=0.0;
for(p=dizi; p < &dizi[n]; p++)
t += *p;
return (t/n);
}
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:
int kutle[5], *p, *q;şeklinde bir bildirim yapılsın. Buna göre aşağıda yapılan atamalar geçerlidir:
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,
kutle;ile
*(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
Bir dizinin, i. elemanına erişmek için *(p+i) işlemi yapılması zorunludur. Yani
*p+i; /* p nin gösterdiği değere (dizinin ilk elemanına) i sayısını ekle */
*(p+i); /* p nin gösterdiği adresten i blok ötedeki sayıyı hesapla */
anlamındadır. Çünkü, * operatörü + operatörüne göre işlem önceliğine sahiptir.
Program 11.4'de tanımlanan fonksiyon kendine parameter olarak gelen n elemanlı bir dizinin aritmetik ortlamasını hesaplar.
Bağlantıları görmek için lütfen
Giriş Yap
Bir dizi ile gösterici arasındaki ilişki01:
02:
03:
04:
05:
06:
07:
08:
09:
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
Dizinin ortalaması = 3.300000
20. - 31. satırda tanımlanan fonksiyon aşağıdaki gibi de yazılabilirdi:
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.