27 Şubat 2017 Pazartesi

İşaretçi (Pointer) Kavramı


C dili, bir değişkenin adresinin bir başka değişkende saklanmasına izin verir. Bu değişkene işaretçi denir.
İşaretçi denmesinin sebebi ilgili değişkenin adresini işaret etmesinden yani göstermesinden kaynaklanır.
Diğer bir deyişle işaretçi, bir değişkenin adresini içeren başka bir değişkendir.

İşaretçiler, C’nin yönetilmesi en zor yetenekleri arasındadır.
Programların referansa göre çağırma yapmasını sağlarlar.
İşaretçiler sayesinde; Bağlı listeler (Linked List), Sıralar (Queue), Yığınlar (Stack) ve Ağaçlar (Tree) gibi büyüyüp küçülebilen dinamik veri yapılarının oluşturulması ve yönetilmesi sağlanır.


Bir işaretçi, diğer değişkenler gibi, sayısal bir değişkendir.
Bu sebeple kullanılmadan önce program içinde bildirilmelidir. İşaretçi tipindeki değişkenler aşağıdaki gibi tanımlanır:

    tip_adı *isaretci_adı;

Burada tip_adı herhangi bir C veri türü olabilir. Değişkenin önündeki * karakteri yönlendirme (indirection) operatörü olarak adlandırılır ve bu değişkenin veri değil bir adres bilgisi tutacağını işaret eder.



Örnek:
char  *kr;                   /* tek bir karakter için */
int   *x;                          /* bir tamsayı için */
float *deger, sonuc;   /* deger işaretçi tipinde, sonuc sıradan bir gerçel                   değişken */

Yukarıda bildirilen işaretçilerden; kr bir karakterin, x bir tamsayının ve deger bir gerçel sayının bellekte saklı olduğu yerlerin adreslerini tutar.

 int *ptam, tam = 33;
          .
          .
          .
 ptam = &tam;

Bir işaretçiye, bir değişkenin adresini atamak için & (adres) operatörünü kullanırız.
ptam işaretçisi tam değişkeninin saklandığı adresi tutacaktır.


Gösterimde, ptam göstericisinin içeriği tam değişkeninin içeriği (33) değil adresidir (0x3fffd14). Ayrıca, ptam değişkeni, bellekte başka bir hücrede saklandığına ve bu hücrenin int değil int * tipinde bir bölge olduğuna dikkat ediniz.






Örnek: İşaretçi Gösterimi ve Değer Değiştirme 





tam adlı değişkenin içeriğine ptam işaretçisi kullanılarak da erişilebilir.
Bunun için program içinde ptam değişkeninin önüne yönlendirme operatörü (*) koyulmuştur.
Yani *ptam, tam değişkeninin adresini değil içeriğini tutar. Buna göre:

              *ptam = 44;

komutuyla, ptam'ın adresini tuttuğu hücreye 44 değeri atanır.

Özetle
*ptam ve tam, tam adlı değişkenin içeriği ile ilgilidir.
ptam ve &tam, tam adlı değişkenin adresi ile ilgilidir.
* yönlendirme ve & (adres) operatörüdür.