C# Programlama Gösterici ve Diziler Arasındaki İlişki

Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
▃ ▅ ησ ♥ яєѕρєcт ▅ ▃
Süper Üye
Katılım
24 Eyl 2016
Mesajlar
600
Tepki puanı
10
Ödüller
9
9 HİZMET YILI
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:
         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şki

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


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.
 
Durum
Üzgünüz bu konu cevaplar için kapatılmıştır...
Üst