6 Mart 2017 Pazartesi

NULL İşaretçi


Bir işaretçinin bellekte herhangi bir adresi göstermesi, veya önceden göstermiş olduğu adres iptal edilmesi istenirse NULL sabiti kullanılır.
Bu sabit derleyicide ASCII karakter tablosunun ilk karakteridir ve '\0' ile sembolize edilir.


 int *ptr, a = 12;
          …
ptr = &a;     // ptr bellekte a değişkenin saklandığı yeri gösteriyor 
          …
ptr = NULL;   // ptr bellekte hiç bir hücreyi göstermiyor

*ptr = 8      // hata! NULL işaretçisinin gösterdiği yere bir değer                atanamaz


void Tipindeki İşaretçiler


void işaretçiler herhangi bir veri tipine ait olmayan işaretçilerdir.
Bu özelliğinden dolayı, void işaretçi genel işaretçi (generic pointer) olarak da adlandırılır.
void göstericiler, void anahtar sözcüğü ile bildirilir.

Örnek:
    void *adr;

Örnek: Fonksiyon İşaretçileri


Fonksiyon İşaretçileri


Fonksiyon işaretçileri, işaretçi (pointer) kavramının gücünü gösterin diğer bir uygulama alanıdır.
Dizilerde olduğu gibi, fonksiyon adları da sabit işaretçidir.
Fonksiyon kodlarının bellekte bir adreste tutulduğu şeklinde düşünebiliriz.
Fonksiyon işaretçisi basit olarak fonksiyon adının saklandığı bellek adresini tutan bir işaretçidir.
Fonksiyon işaretçileri sayesinde fonksiyonlar başka fonksiyonlara parametre olarak aktarılabilmektedirler.
Fonksiyonların bellekteki adresleri aşağıdaki kodlama kullanımıyla öğrenilebilir:

int f(int);     /* fonksiyon bildirimi */
int (*pf)(int); /*fonksiyon göstericisi bild.*/
pf = &f;        /*f'nin adresini pf'ye ata! */

Fonksiyon Geri Dönüş Değeri Olan İşaretçiler



Fonkiyonların geri dönüş değeri bir işaretçi olabilir.
Bu durumda fonksiyon bir değer değil adres döndürecek demektir.
Örnek:
Önce bir dizinin indisleri, dizi değerleri ve dizi elemanlarının adresleri ekrana basılacaktır.
Daha sonra, maxAdr(); fonksiyonu ile dizinin en büyük elemanının adresi döndürülür.


Örnek: Fonksiyon Geri Dönüş Değeri Olan İşaretçiler







Örnek4: İşaretçiler Kullanılarak Takas (Swap)


Örnek3: İşaretçi Olan Fonksiyon Parametresi



x değişkeni f1(x) ve f2(&x) fonksiyonlarına, sırasıyla değer ve adres geçerek aktarılmıştır.
f1 içinde x (n = 66; işlemi ile) değişime uğramış, fakat çağrılma işleminin sonucunda, x'in değeri değişmemiştir.
Ancak f2 içinde x ( *n = 77 işlemi ile) değişimi sonucunda, x’in değeri çağrıldıktan sonrada korunmuştur.
Yani, adres geçerek yapılan aktarımda, f2'ye aktarılan değer değil adres olduğu için, yollanan x parametresi f2 içinde değişikliğe uğrayacak ve bu değişim çağrıldığı satırdan itibaren devam edecektir.

Fonksiyon Parametresi Olan İşaretçiler

C programlama dilinde fonksiyon parametreleri
Değer geçerek (pass by value)
Adres geçerek (pass by reference)
   olarak geçilebilirler.
Şu ana kadar gördüğümüz fonksiyon kullanımında geçirilen parametreler, fonksiyon içerisinde değiştirilse bile, fonksiyon çağırıldıktan sonra bu değişim çağrılan yerdeki değerini değiştirmez.
Fakat, bir parametre adres geçerek aktarılırsa, fonksiyon içindeki değişikler geçilen parametreyi etkiler.
Adres geçerek aktarım, gösterici kullanmayı zorunlu kılar.

Örnek3: İşaretçi Olan Fonksiyon Parametresi

main fonksiyonu içerisinde int türündeki x değişkenine 55 değerine atayan.
Aşağıdaki fonksiyonları yazın.
void f1(int  n);
void f2(int *n);
f1 fonksiyonu kendisine gelen n değişkenine 66 değerini atasın, f2 fonksiyonu kendisine gelen n işaretçisine 77 değerini atasın.
main içerisinde f1 ve f2 fonksiyonlarını çağırarak x’i parametre olarak geçirin.
f2 fonksiyonuna f2(&x); olarak parametre geçirilecektir.
Her fonksiyon çağırımı sonrasında main fonksiyonu içerisinde x değişkenini yazdırın.

Örnek2:Ortalama Bul


Örnek1:İşaretçi/Dizi Offset Yazdırma

Aşağıdaki ekran çıktısının C programlama dilinde kodunu yazalım.

Örnek1:İşaretçi/Dizi Offset Yazdırma