İşaretçi bellek alanındaki bir gözün adresinin saklandığı değişkendir. Yani işaretçilere veriler değilde o verilerin bellekte saklı oldugu gözlerin adresleri atanır. Bu C dilini güçlü kılan nedenlerin başında gelir aslında bütün programlama dilleri işaretçiler vardır (c# vb..) ve bazı programlarda işaretçi kullanmak zorunlu olabilir. Özellikle string bir ifadeye ulaşmak için adresleri kullanmak gerekecektir.
C dilinde bir fonksiyon return ile bir sonuç döndürürdü fakat bazı uygulamalarda birden fazla sonuç döndürmesini isteyebiliriz bu durumda da fonksiyona parametre olarak adres göndermemiz gerekecektir.
İşaretçi Tanımı:
İşaretcinin adının önüne ’*’ işareti konulur;
int *p;
İşlemcimizin adresleme biti belirli oldugu için hangi tipte olursa olsun bellekte aynı uzunlukta yer işgal eder
Yani aşağıdaki işaretçilerin hepsi aynı uzunluktadır
int *p; float *q char *r
Aralarında fark vardır ama p bir tamsayının q gerçel bir sayının r ise karakterin adresini tutar
Gelelim işaretçiye değer atamaya ;
Hatırlayalım scanf ile bir değişkene nasıl değer atıyorduk
int p;
scanf("%d",&p); // p değişkenine & operatörü ile atama yaptık
İşaretçilere değer atamak içinde & operatörü kullanılır.
int *p,*m,j,k; k=100; //k ya 100 atadık p=&k; //K nın adresini p işaretçisine atadık m=&j; //m işaretcisine atadık *m=555; //işaretçinin önüne * konulursa değer atanır 555 atanmıştır
İşaretçi aritmetiği
Adreslerde elimizdeki adres taban alınıp önceki veya sonraki adreslere erişmek istenebilir.Döngülerde ki gibi toplama çıkartma operatörlerimizi kullanıyoruz.
int * p,*q; p++; q--;
İşareçilerin Karşılaştırılması
int strlen(char *p)
{
char *q=p;
while(*q!=NULL)
q++;
return q-p;
}
Fonkiyona parametre olarak kelimenin adresini gönderiyoruz (karşılaştırmk istediğimiz işaretçiler aynı tipte olmak zorunda
İşaretçiler ve Diziler:
Dizinin adı aslında dizinin ilk elemanın adresini tutan bir değişkendir
p=&dizi[0]; //ilk elemanın adresi p ye atanıyor p=dizi; // başlangıç adresi p ye atanıyor q=&tablo[9]; // 10. elemanın adresi q ya atanıyor (9 değil çünkü diziler 0 dan başlıyor ) q=&tablo[50]; // 51 elemanlı dizimiz dersek son elemanın adresini atıyoruz
Şimdi bir örnek yapalım ve işaretçi sayesinde dizinin elemanlarının toplamını bulalım
int toplam(int A[],int n)
{
int *p,toplam=0;
for(p=A;p<&A[n];p++)
{
toplam+=*p;
return toplam;
}
}İki boyutlarda atama işlemi yapılabilir.
Malloc fonksiyonu kullanarak 20 elemanlık bir dizi oluşturalımmain()
{
int *p;
p=(int *)malloc(20*sizeof(int)); //işletim sisteminden 20 elemanlık yer açmasını istiyoruz
}