Benim kişisel görüşüm, okları bu şekilde gösteren veya işaretçileri anlamayı zorlaştıran resimlerdir. Bazı soyut, gizemli varlıklar gibi görünmelerini sağlıyor. Onlar değil.
Bilgisayarınızdaki diğer her şey gibi, işaretçiler de sayılardır . "İşaretçi" adı, "adres içeren bir değişken" demenin şık bir yoludur.
Bu nedenle, bir bilgisayarın gerçekte nasıl çalıştığını açıklayarak işleri karıştırmama izin verin.
Bizde int
, adı i
ve 5 değeri var. Bu, bellekte saklanır. Bellekte saklanan her şey gibi, bir adrese ihtiyacı vardır, yoksa bulamazdık. Diyelim ki i
0x12345678 adresi ve arkadaşıj
6 değeri ile hemen hemen bitiyor. İnt'in 4 bayt ve işaretçilerin 4 bayt olduğu 32 bit CPU varsayarsak, değişkenler fiziksel bellekte şu şekilde saklanır:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
Şimdi bu değişkenlere işaret etmek istiyoruz. İnt int* ip1
ve için bir işaretçi oluşturuyoruz int* ip2
. Bilgisayardaki her şey gibi, bu işaretçi değişkenleri de bellekte bir yere ayrılır. Diyelim ki, hemen sonra, bellekteki bir sonraki bitişik adreslere ulaşacaklar j
. İşaretçileri önceden tahsis edilen değişkenlerin adreslerini içerecek şekilde ayarladık: ip1=&i;
("i'nin adresini ip1'e kopyala") ve ip2=&j
. Çizgiler arasında ne olur:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
Yani elimizde sadece 4 baytlık rakamlar içeren bellek parçaları vardı. Görünürde hiçbir yerde mistik veya büyülü ok yoktur.
Aslında, sadece bir bellek dökümü bakarak, 0x12345680 adresinde bir int
veya olup olmadığını söyleyemeyiz int*
. Fark, programımızın bu adreste depolanan içeriği nasıl kullanmayı seçmesidir. (Programımızın görevi aslında CPU'ya bu sayılarla ne yapacağını söylemektir.)
Sonra başka bir dolaylılık düzeyi ekliyoruz int** ipp = &ip1;
. Yine, sadece bir yığın bellek alıyoruz:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
Desen tanıdık geliyor. Yine bir sayı içeren 4 baytlık başka bir yığın.
Şimdi, yukarıdaki kurgusal küçük RAM'in bir bellek dökümü olsaydı, bu işaretçilerin nereye işaret ettiğini elle kontrol edebiliriz. ipp
Değişkenin adresinde nelerin depolandığına bakarız ve 0x12345680 içeriğini buluruz. Hangi tabii ki ip1
saklandığı adres . Bu adrese gidebilir, oradaki içeriği kontrol edebilir ve adresini bulabilirizi
ve sonunda o adrese gidip 5 sayısını bulabiliriz.
Eğer ipp içeriğini *ipp
alırsak, işaretçi değişkeninin adresini alırız ip1
. Yazarak *ipp=ip2
ip2'yi ip1'e kopyalarız ip1=ip2
. Her iki durumda da
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(Bu örnekler büyük bir endian CPU için verilmiştir)
ipp
tanımlarken türünü ekleyin , böylece sorunuz tamamlandı ;-)