11.2 Gösterici Nedir?
11.2 Gösterici Nedir?
Gösterici, bellek alanındaki bir gözün adresinin saklandığı değişkendir. Göstericilere veriler (yani değişkenlerin içeriği) değil de, o verilerin bellekte saklı olduğu hücrenin başlangıç adresleri atanır. Kısaca gösterici adres tutan bir değişkendir.
Bir gösterici, diğer değişkenler gibi, sayısal bir değişkendir. Bu sebeple kullanılmadan önce program içinde bildirilmelidir. Gösterici tipindeki değişkenler şöyle tanımlanır:
1 |
tip_adı *gösterici_adı; |
Burada tip_adı herhangi bir C tip adı olabilir. Değişkenin önünedeki * 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. Örneğin:
1 2 3 |
char *kr; /* tek bir karakter için */ int *x; /* bir tamsayı için */ float *deger, sonuc; /* deger gösterici tipinde, sonuc sıradan bir gerçel değişkenler */ |
Yukarıda bildirilen göstericilerden; kr bir karakterin, x bir tamsayının ve deger bir gerçel sayının bellekte saklı olduğu yerlerin adreslerini tutar.
Bir göstericiye, bir değişkenin adresini atamak için adres operatörünü kullanabiliriz. Örneğin tamsayı tipindeki tam adlı bir değişken ve ptam bir gösterici olsun. Derleyicide, aşağıdaki gibi bir atama yapıldığında:
1 2 3 4 5 |
int *ptam, tam = 33; . . . ptam = &tam; |
ptam göstericisinin tam değişkeninin saklandığı adresi tutacaktır. Bu durum Şekil 11.3’deki gibi tasvir edilir.
Şekil 11.3: Göstericinin bir değişkenin adresini göstermesi
Şekil 11.3’deki 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. Buraya kadar anlatılanlar, Program 11.1’de özetlenmiştir.
Program 11.1: Bir değişkenin içeriğini ve adresini ekrana yazdırma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* 10prg01.c: ilk gösterici programı */ #include <stdio.h> int main() { int *ptam, tam = 33; ptam = &tam; printf("tam: icerik = %d\n", tam); printf("tam: adres = %p\n",&tam); printf("tam: adres = %p\n",ptam); return 0; } |
7. satırda değişkenler bildirilmiştir. 9. satırdaki atama ile tam değişkeninin adresi, ptam göstericisine atanmıştır. Bu satırdan itibaren ptam, tam değişkeninin gösterir. 11. satıda tam‘ın içeriği (33 sayısı), 12. ve 13. satırda tam‘ın adresi, %p tip karakteri ile, ekrana yazdırılmıştır. Ekran çıktısı incelendiğinde, &tam ve ptam içereriğinin aynı anlamda olduğu görülür.
ÇIKTI
1 2 3 |
tam: icerik = 33 tam: adres = 0x3fffd14 tam: adres = 0x3fffd14 |
tam adlı değişkenin içeriğine ptam gösterici üzerinde de erişilebilir. Bunun için program içinde ptam değişkeninin önüne yönelendirme operatörü (*) koymak yeterlidir. Yani *ptam, tamdeğişkeninin adresini değil içeriğini tutar. Buna göre:
1 |
*ptam = 44; |
komutuyla, ptam‘ın adresini tuttuğu hücreye 44 değeri atanır. Bu durum, Program 11.2’de gösterilmiştir.
Program 11.2: Bir değişkenin içeriğini ve adresini ekrana yazdırma
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* 10prg02.c: ikinci gösterici programı */ #include <stdio.h> int main() { int *ptam, tam = 33; ptam = &tam; /* ptam -> tam */ printf("&tam = %p\n",&tam); printf("ptam = %p\n",ptam); printf("\n"); printf("tam = %d\n",tam); printf("*ptam = %d\n",*ptam); printf("\n"); *ptam = 44; /* tam = 44 anlamında */ printf("tam = %d\n",tam); printf("*ptam = %d\n",*ptam); return 0; } |
ÇIKTI
1 2 3 4 5 6 7 8 |
&tam = 0x3fffd14 ptam = 0x3fffd14 tam = 33 *ptam = 33 tam = 44 *ptam = 44 |
Özetle ptam = &tam atamasıyla:
- *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.