Uefa Maçları Canlı İzle
RSS
 

C-C++ İşaretçiler (Pointers) Nedir?

28 Eki

İş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 :)

) bir işaretçi tanımlayıp p nin değerini atıyoruz kelimenin sonuna gelineye kadar q arttırıyoruz return le kelimenin başı ile sonunun farkını döndürüyoruz bu da bize kelime katarının uzunluğunu veriyor ;)

İş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ım

main()
{
int *p;
p=(int *)malloc(20*sizeof(int)); //işletim sisteminden 20 elemanlık yer açmasını istiyoruz
}

 
 

Leave a Reply