27 Şubat 2017 Pazartesi

İşaretçi Aritmetiği



İşaretçiler kullanılırken, bazen işaretçinin gösterdiği adres taban alınıp, o adresten önceki veya sonraki adreslere erişilmesi istenebilir.
Bu durum, işaretçiler üzerinde, aritmetik işlemcilerin kullanılmasını gerektirir.
İşaretçiler üzerinde yalnızca
toplama (+),
çıkarma (-),
bir arttırma (++) ,
bir eksiltme (--)
   operatörleri işlemleri yapılabilir

Aşağıdaki gibi üç tane gösterici bildirilmiş olsun:

char   *kar;    ?    10000 (0x2710)
int    *tam;    ?    20000 (0x4e20)
double *ger;    ?    30000 (0x7530)

Buna göre aşağıdaki atama işlemlerinin sonucu ne olmalıdır?
kar++;       
tam++;       
ger++;       

Bir işaretçiye ekleme yapıldığında, o anda tuttuğu adres ile eklenen sayı doğrudan toplanmaz.
Böyle olsaydı, bu atamaların sonuçları sırasıyla 10001, 20001 ve 30001 olurdu.
Gerçekte, işaretçiye bir eklemek, işaretçinin gösterdiği yerdeki veriden hemen sonraki verinin adresini hesaplamaktır
Buna göre atama işlemlerinin sonucu:
kar++;        ?    10001 (0x2711)
tam++;        ?    20004 (0x4e24)
ger++;        ?    30008 (0x7538)

Genel olarak, bir işaretçiye n sayısını eklemek veya çıkarmak, bellekte gösterdiği veriden sonra veya önce gelen n. elemanın adresini hesaplamaktır.
Buna göre aşağıdaki atamalar şöyle yorumlanır.
 kar++;      /* kar = kar +   sizeof(char)*/
 tam = tam + 5;/* tam = tam + 5*sizeof(int)*/
 ger = ger - 3; /*ger = ger - 3*sizeof(double)*/

Örnek: İşaretçi Aritmetiği