Pointer nedir? Offset nedir?

Pointer nedir?

Pointerlar, bir şeyin belirtgecidir. Mesela bir ev adresi olsun; Ankara/Batıkent. Ankara/Batıkent bir pointer’dir bir adresdir. Bu pointerin içerisinde birşeyler vardır. Ev olabilir, araba olabilir, eşya olabilir, insan olabilir.

Programlamada ise bildiğim kadarıyla, pointer bir hafıza adresidir. Bu hafıza adresinin içinde değerler vardır. Hafıza adresi bir sayıdır, İstanbul/Beylikdüzü gibi belirtemiyoruz. Mesela 0x4810AE adresi bir pointer ise, bu pointerin içerisinde bir de numara vardır, örneğin 1500 sayısı. Bu 1500 sayısı oyundaki HP’yi (Health point) göstersin. HP değerinin pointeri 0x4810AE’dir.

Yan yana bitişik komşu Ali veli ve Osmanın evleri olsun.
Alinin evinin 4m ilerisinde Veli,
Velinin evinin 4m ilerisinde Osmanın evi olsun.
Alinin Cuma sokak No12 adresi dersek,
Veli Cuma Sokak no12 + 4m ilerisidir,
Osman ise 8m ilerisidir.
Bu 4m ve 8m şeysine Offset deniyor.

Yani temel bir adresin ne kadar ötesinde neresi var anlamına geliyor.
Yanlışım varsa düzeltirseniz sevinirim.
HP ve MP değerleri de böyle offsetlidir,
4 Byte ilerisinde mesela MP değeri vardır,
4 Byte ilerisinde Attack Point değerin kayıtlıdır vs.

Offseti bilimsel açıklayayım. Bir struct’ın point ettiği adresteki elemanların,
türlerine göre (2 byte 4 byte veya 8byte) öteli olarak sıralanmasından dolayı, +2, +4, + 0x1c gibi pozisyonları oluşur.
Yukarıda anlattığım olay gibi, örnek: Veli, Alin’in evinin 4m ilerisinde gibi.

Başka bir örnek, bir şiirde bir mısranın yerini, mesela 7.kıta 3. mısra diye ifade ediyoruz.
Şiirin başı bir adrestir yani 0 adresi.
O halde 7. kıta ise, 0. adresten 7 birim uzaklığı belirtir.
3. mısra ise, 7birim uzaktaki adresin 3 birim ofsetidir.

örnek bir yapı (struct)

 

Mesela th32ProcessID bunun offseti 8’dir. çünkü +0’ıncı ofsette dwSize vardır ve boyutu DWORD yani 4byte’dır. Bu yüzden cntUsage’ın ofseti +4’olur, ve cntusage’ın boyutu 4 byte olduğundan, bir sonraki eleman da +8 ilerisinde olacaktır, bu da th32ProcessID’in ofsetidir. th32ProcessID değişkeni de uint16 olduğundan(yani 2 byte), bundan sonraki gelen elemanın ofseti (8+2=)10’dur, 10 ise hexadecimal olarak 0xA veya &HA olarak gösterilir. &HA ofsetine sahip eleman th32DefaultHeapID’dir.

Arkadaşlar pointerdan sonra gelen offsetleri şöyle daha iyi anlayabiliriz.
Çekmece örneği veriliyor bu güzel örnek.
Struct çekmeceli dolaptır, pointer içindeki adres de bu dolabın en üst çekmecesi neresidir onu belirtir (örneğin en alt çekmeceyi ifade edebilir veya dolabın en üstünü).
Misal olarak pointer, 100 tane çekmece gözlü bir dolabın en üstünü ifade etsin. İlk 4 çekmeceye çoraplarınızı koyuyorsunuz. Çorapların ofseti 0’dır. Ama çoraplar 4 çekmece kapladıgı için, pantolonlarınızı koyacağınız çekmece en yakın +4’üncü çekmeceye girmeli. Pantolonlar diyelim 2 tane var ve 2 çekmece size yetiyor. O halde en son pantolon 4+2 = 6. çekmecede olacaktır(ilk çekmece 0’dan başlamazsa tabi). Şimdi gömleklerinizi koymak istiyorsunuz, gömleklerin ofseti +6 olmalı. 1 gömleğiniz var ve 1 çekmece yetiyorsa 7. çekmeceyi de kapatırsınız. Bundan sonra koyulacak saatin çekmecesi +7 ofsetli olur. Bu şekilde gider.

Şimdiki yazacaklarımı anlayabilmek için bir önceki yazdığımı çok iyi okumak gerekli.
Dolabı bulan çekmecesini çeker içindekini görür. Çekmeceyi açabilmesi için dolabı bulması lazımdır.
Dolaba uzanan tüm elleri izlersin, kim hangi çekmeceyi açıyorsa onun o çekmeceyle ne alakası olduğunu araştırırsın.
Yarın öbürgün çekmecelerin yerleri veya sırası kaydığında ise, ona uzanan elden tanırsın kendisini. O elin önceden ne istediğini bildiğin için, çekmecelerin sırası kaysa bile sonradan onu yakalayıp hangi çekmeceye elinin uzandığını anlarsın (Mesela saat başka yere konulmuştur ama adam o farklı yeri biliyordur ve oradan uzanıp saati almaya çalışır; bu da otopointer mantığıdır).