C Öğreticisi 13 (İşaretçiler)
Last updated
Was this helpful?
Last updated
Was this helpful?
Bu yazılar adresindeki yazı dizilerinin çevirileridir.
C’deki İşaretçiler’i öğrenmesi kolay ve eğlencelidir. Bazı C programlama görevleri işaretçilerle çok daha kolay gerçeklenir, ve diğer bazı görevler (dinamik bellek ayrımı gibi) işaretçiler olmadan gerçeklenemez. Bu yüzden iyi bir C programcısı olmak için işaretçileri öğrenmek kaçınılmazdır. Hadi öğrenmeye basit adımlarla başlayalım.
Bildiğiniz gibi her değişken bir hafıza bölmesidir ve her hafıza bölmesi ampersand(&) sembolü ile erişilebilen tanımlanmış bir adrese sahiptir. Tanımlanmış değişkenlerin adresini yazdıran takip eden örneği dikkate alın -
#include <stdio.h>
int main () {
int degisken1;
char degisken2[10];
printf(“Degisken 1’in adresi: %x\n”, °isken1 );
printf(“Degisken 2’nin adresi: %x\n”, °isken2 );
return 0;
}
Kod derlenip çalıştırıldığında takip eden sonuç çıkar -
Degisken 1’in adresi: bff5a400
Degisken 2’nin adresi: bff5a3f6
Bir işaretçi, bir değişkenin adresini gösteren diğer bir değişkendir, diğer bir deyişle, bellekteki erişimin direkt adresidir. Genel bir işaretçi tanımlaması şöyledir -
tip *değişkenİsmi;
İşte işaretçilerin temel tipi; geçerli bir C veri türü olmalı ve değişkenİsmi işaretçi değişkenin ismi olmalıdır. İşaretçiyi bildirmek için kullanılan asterisk işareti * çarpma için kullanılan işaretle aynıdır. Ancak, bu ifadede asterisk işareti bir değişkeni işaretçi olarak belirlemek için kullanılmaktadır. Geçerli işaretçi bildirimlerinin bazılarına göz atın -
int *ip; /* tamsayı değer bir işaretçi */
double *dp; /* double değer bir işaretçi */
float *fp; /* float değer bir işaretçi */
char *ch /* char değer bir işaretçi */
Tamsayı, float, char veya başka bir şekilde olsun, tüm işaretçilerin değerinin gerçek veri türü, bir bellek adresini temsil eden uzun bir onaltılık(hexadecimal) sayıdır. Farklı veri türlerinin işaretçileri arasındaki tek fark, işaretçinin işaret ettiği değişken veya sabitin veri tipidir.
İşaretçilerin yardımıyla çok sık yapacağımız birkaç önemli işlem var. (a) Bir işaretçi değişkeni tanımlarız, (b) bir değişkenin adresini bir işaretçiye atar ve © son olarak işaretçi değişkeninde bulunan adresteki değere erişiriz.
Bu, işleneni tarafından belirtilen adreste bulunan değişkenin değerini döndüren tekli operatör * kullanılarak yapılır. Aşağıdaki örnek bu işlemleri kullanır -
#include <stdio.h>
int main () {
int var = 20; /* gerçek değişken bildirimi */
int *ip; /* işaretçi değişken bildirimi */
ip = &var; /* var değişkenini işaretçi değişkeninde sakla*/
printf(“değişkenin adresi: %x\n”, &var );
/* ip değişkeninde saklanan adres*/
printf(“ip değişkeninde saklanan adres: %x\n”, ip );
/* işaretçi kullanarak değere erişimi */
printf(“*ip değişkeninin değeri: %d\n”, *ip );
return 0;
}
Yukarıdaki kod derlenip çalıştırıldığında, takip eden sonuç ortaya çıkar -
değişkenin adresi: bffd8b3c
ip değişkeninde saklanan adres: bffd8b3c
ip değişkeninin değeri: 20
Tam olarak atanacak bir adresiniz yoksa, bir işaretçi değişkenine NULL değeri atamak her zaman iyi bir uygulamadır. NULL olarak atanan işaretçiye null işaretçi denir. NULL işaretçisi, birkaç standart kütüphanede tanımlanan sıfır değerine sahip bir sabittir. Aşağıdaki programı düşünün -
#include <stdio.h>
int main () {
int *ptr = NULL;
printf(“ptr’nin değeri : %x\n”, ptr );
return 0;
}
Yukarıdaki kod derlenip çalıştırıldığında, takip eden sonuç ortaya çıkar -
ptr’nin değeri: 0
İşletim sistemlerinin çoğunda, programların 0 adresindeki belleğe erişmesine izin verilmez, çünkü bu bellek işletim sistemi tarafından ayrılmıştır. Ancak, bellek adresi 0 özel bir öneme sahiptir; işaretçinin erişilebilir bir bellek konumunu göstermesi amaçlanmadığını belirtir.
Ancak kural gereği, eğer bir işaretçi boş (sıfır) değer içeriyorsa, hiçbir şeye işaret etmeyeceği varsayılır. Boş bir işaretçi olup olmadığını kontrol etmek için ‘if’ ifadesini aşağıdaki gibi kullanabilirsiniz -
if(ptr) /* işaretçi boş değilse başarılı */
if(!ptr) /* işaretçi boşsa başarılı */