Mozilla Türkiye Gönüllü Topluluğu Blog

C Öğreticisi 13 (İşaretçiler)


Bu yazılar https://www.tutorialspoint.com/cprogramming/ 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 
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
	

İşaretçiler Nedir?

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çiler Nasıl Kullanılır?

İş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 (c) 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 
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(“degiskenin adresi: %x\n”, &var );
/* ip degiskeninde saklanan adres*/
printf(“ip degiskeninde saklanan adres: %x\n”, ip );
/* işaretçi kullanarak değere erişimi */
printf(“*ip degiskeninin degeri: %d\n”, *ip );
return 0;
}
	

Yukarıdaki kod derlenip çalıştırıldığında, takip eden sonuç ortaya çıkar -

	
degiskenin adresi: bffd8b3c
ip degiskeninde saklanan adres: bffd8b3c
ip degiskeninin degeri: 20
	

NULL İşaretçiler

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 -

	
double maaş = dizi[9];
	

Bu kod bizi dizinin 10.elemanına götürür, Aşağıdaki kod, bildirim, atama ve dizilere erişme’yi gösterir -

	
#include 
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ı */		
	

Detaylıca İşaretçiler

image ​https://www.tutorialspoint.com/cprogramming/c_pointers.htm​

Bir sonraki yazıya buradan ulaşabilirsiniz.