C Dilinde Dizi Adresi Hakkında

Başlatan bit01, 14 Ocak 2017, 21:20:06

bit01

Dizideki elemanların adresleri peş peşe olmak zorunda mı ?

Yoksa bir yerde hata mı yaptım?



muhittin_kaplan


bit01

Alıntı yapılan: muhittin_kaplan - 14 Ocak 2017, 21:29:14
diziyor. dizi, array.

Yerli yabancı kitap örneklerinde adresler hep düzgün sıralanıyor. Elimdeki kaynaklarda da aksi bir durumdan bahsedildiğini görmedim. O yüzden sordum. Sıkıntı yok o zaman.

muhittin_kaplan

seninki düzgün sıralı değil mi ?

bit01

Alıntı yapılan: muhittin_kaplan - 14 Ocak 2017, 21:33:25
seninki düzgün sıralı değil mi ?

0028FF10
0028FF48
76109E34
0028FF78
004011E7
00000001

Hayır 5 elemanın adresleri bu şekilde

muhittin_kaplan

    int *p,a[]={1,10,15,20,25};
    printf("P degeri %u",p);
    printf("A0 adres %u\r\n",&a[0]);
    printf("A1 adres %u\r\n",&a[1]);
    printf("A2 adres %u\r\n",&a[2]);
    printf("A3 adres %u\r\n",&a[3]);
    printf("A4 adres %u\r\n",&a[4]);
   
    return 0;

muhittin_kaplan

sen a nın adresini atmamışsın

  int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/

bit01

Alıntı yapılan: muhittin_kaplan - 14 Ocak 2017, 21:42:51
sen a nın adresini atmamışsın

  int  var = 20;   /* actual variable declaration */
   int  *ip;        /* pointer variable declaration */

   ip = &var;  /* store address of var in pointer variable*/


a bir dizi olduğu için ismini yazığımda a[0]'ın adresini yazmış oluyor. Atamada sorun yok ancak sorun;

(&p)[0]

&p[0]


bu ikisi arasında. Pointer kısmını paranteze almam ne gibi bir fark oluşturuyor? Alttaki gibi yapınca çalışıyor.

mir_as82

#8
Burada sorun şundan kaynaklanıyor
Paranteze alınca pointerin adresi alınıp işleme sokuluyor.
Ama parantezsiz olunca p nin tuttuğu adrese 0 (sizeof pointerin türü) eklenip daha sonra onun adresi alınıyor.

Yani birinde pointerin kendi adresini alıyorsun, alttakinde parantezsiz olanda ise pointerin içeriğini alıp adresini kullanıyorsun.
Biraz daha açayım, elinde bir tane zarf var ve zarfın bir unique numarası var kabul et. Bu zarfın içinde başka bir zarfın numarası var.(içerideki adres dizinin başlangıç adresi olsun).
Sen dışarıdaki zarfın adresini alıp ona 0 toplayıp sonra eline geçen adres ile işlem yapınca içerideki zarf ile işlem yapmış olmazsın.

mir_as82

C dili diğer diller gibi bir değildir. Onu öğrenip kullanmak için ya okuldan sağlam bir eğitim almalısınız veya kendi kendine öğrenebilme yeteneğiniz iyi ise sağlam bir çalışma yapmalısınız.
Bunların hiç biri yoksa bu sefer dışardan  eğitim almanızı tavsiye ederim.

bit01

Alıntı yapılan: mir_as82 - 15 Ocak 2017, 08:57:44
C dili diğer diller gibi bir değildir. Onu öğrenip kullanmak için ya okuldan sağlam bir eğitim almalısınız veya kendi kendine öğrenebilme yeteneğiniz iyi ise sağlam bir çalışma yapmalısınız.
Bunların hiç biri yoksa bu sefer dışardan  eğitim almanızı tavsiye ederim.

Problemi ve çözümünü anladım çok teşekkürler. Okul eğitimlerinde en fazla toplama çıkartma öğretiliyor maalesef. Mantığı ve işleyişini anlamak için yarım dönem yeterli olmuyor. Şuan Necati Ergin hocanın pdf ders notundan gidiyorum. İmkanım olursa ileri ki dönemlerde CSD'de Necati hocadan ders almaya çalışacağım.

mir_as82

Okulda eğitim veren hocalar da bilmiyor zaten. Üniversite nin birinde(iki yıllık değil, 4 yıllık mühendislik eğitimi veren bir sınıfa ders veren) C dersi verdiğini söyleyen bir hocanın global alanda tanımlanan değişkenin hayata varsayılan değerle geleceğini bilmediğine bizzat şahit oldum.