Bu yazıda işaretçiler hakkında bilgi edineceksiniz; onlar nedir, onları nasıl kullanırsınız ve onlarla çalışırken karşılaşabileceğiniz yaygın hatalar nelerdir.
Pointer işaretçiler, Java ve Python gibi diğer popüler programlama dillerinden farklı olarak C ve (C ++) programlamanın güçlü özelliklerindendir.
Pointer işaretçiler, C programında belleğe erişmek ve adresi işletmek için kullanılır.
Pointer işaretçiler kavramına girmeden önce, ilkin C’deki adres ifadesiyle tanış olalım.
Programınızda bir var
değişkene sahipseniz, &var
, size bellekteki değişkenin adresini verir, burada & simgesi
referans operatörü olarak adlandırılır.
scanf()
fonksiyon işlevini kullanırken bu gösterimi görmüş olmalısınız.
Fonksiyon işlevinde, var
değişkeninin bellek adresine kullanıcının girilen değerini kaydetmek için kullanılmıştır.
scanf("%d", &var);
/* C referans operatörünün kullanımını gösteren örnek */
#include <stdio.h>
int main()
{
int var = 5;
printf("Value: %d\n", var);
printf("Address: %u", &var); // Dikkat, önce (&) var.
return 0;
}
Output
Value: 5
Address: 2686778
Not: Bu kodu kullanırken farklı adres değeri elde edebilirsiniz.
Yukarıdaki kaynak kodda, değer: 5
, bellek yerel adresi: 2686778
‘de saklanır. var
, sadece o yere verilen isimdir.
C’de sadece başka bir değişkenin adresini saklamanızı sağlayan özel bir değişken vardır. Pointer değişkeni veya basitçe pointer işaretçi olarak adlandırılır.
‘*Pointer** İşaretçinin Beyanı
data_type* pointer_variable_name;
int* p;
Yukarıdaki deyim, p’yi, int
data tipinde bir pointer işaretçi değişkeni olarak tanımlar.
Tartışıldığı üzere &, referans operatörü olarak adlandırılır. Bir değişkenin bellekteki adresini verir.
Aynı şekilde, size adresten değer alan başka bir operatör vardır, buna bir referans kaldırma operatörü (*) denir.
Aşağıdaki örnek, pointer işaretçiler, referans operatörü (&) ve referans kaldırma operatörünün (*) kullanımını açıkça göstermektedir.
Not: Pointer işaretçi bildirirken * işareti, referans kaldırmayla ilgili bir operatör değildir. Bir pointer işaretçi oluşturan sadece benzer bir gösterimdir.
/* C pointer işaretçilerin kullanımını gösteren örnek */
#include <stdio.h>
int main(){
int* pc;
int c;
c=5;
printf("Address of c:%u\n",&c);
printf("Value of c:%d\n\n",c);
pc=&c;
printf("Address of pointer pc:%u\n",&pc);
printf("Content of pointer pc:%d\n\n",pc);
printf("Value of pointer *pc:%d\n\n",*pc);
c=11;
printf("Value of c:%d\n\n",c);
printf("Address of pointer pc:%u\n",&pc);
printf("Content of pointer pc:%d\n\n",pc);
printf("Value of pointer *pc:%d\n\n",*pc);
*pc=2;
printf("Value of *pc:%d\n\n",*pc);
printf("Address of c:%u\n",&c);
printf("Value of c:%d\n\n",c);
return 0;
}
Output
Address of c:2686760
Value of c:5
Address of pointer pc:2686764
Content of pointer pc:2686760
Value of pointer *pc:5
Value of c:11
Address of pointer pc:2686764
Content of pointer pc:2686760
Value of pointer *pc:11
Value of *pc:2
Address of c:2686760
Value of c:2
Not: Bu kodu kullanırken farklı adres değeri elde edebilirsiniz.
Pointers • C programlamada işaretçilerin işlenmesi.
int* pc;
bir pc pointer işaretçi ve int c oluşturur; normal bir c değişken oluşturur.
pc ve c her ikisi de başlatılmadığından, pc pointer işaretçi hiçbir adresi işaret etmez ya da rastgele bir adrese işaret eder. Benzer şekilde, c değişkene bir adres atanır ancak rasgele/çöp değer içerir.c=22;
tamsayı değeri 22’yi c değişkenine atar; diğer bir deyişle, tamsayı değeri 22, c değişkeninin bellek yereline saklanır.
Bunu not et ki &c
(c bellek adresini) yazdırırken, biz %d yerine %u kullanırız, çünkü bellek adresi genelde unsigned, işaretsiz bir tam sayı olarak ifade edilir (her zaman pozitiftir).pc=&c;
c değişkenin bellek adresini pc pointer işaretçi ye atar.
Çıktı yazdırılırken, pc değeri c‘nin bellek adresi ile aynı ve (*pc) değerinin de 22 olduğunu görürsünüz.c=11;
değişken c‘ye 11 atar.
Pointer işaretçi pc üzerindeki etkisini görmek için c‘ye yeni bir değer atadık.pc
pointer işaretçi, c
ile aynı bellek adrese işaret ettiğinden, pc pointer işaretçisinin işaret ettiği değer de 11’dir.
pc‘nin bellek adresini ve içeriğini basarak; değeri güncellenmiş içeriği, 11 olarak gösterir.*pc=2;
pc pointer işaretçisinin gösterdiği bellek konumunun içerdiği değeri 2 olarak değiştirir.
pc pointer işaretçisinin adresi c değişkeninin adresi ile aynı olduğu için c‘nin değeri de 2 olarak değişir.Diyelim ki, pointer işaretçi pc’nin, c değişkeninin bellek adresinin içeriğini işaret etmesini istiyorsunuz. Sonra,
int c, *pc;
// Hatalı! pc içeriği bir adrestir oysa c bir adresi değildir.
pc = c;
// Hatalı! *pc adresin işaret ettiği bir değerken, &c bir adrestir.
*pc = &c;
// Doğru! pc bir adres, ve &c de bir adres.
pc = &c;
// Doğru! *pc adresin gösterdiği değerdir ve c de bir değerdir.
*pc = c;
Her iki durumda da, pointer işaretçi pc
, c
bellek adresini işaret etmez, içerdiği değeri işaret eder.