C++ Pointer Ve Reference
-
#include
using namespace std;
int main(){
int a=4;
int* pa=&a; //pointer tanımlaması
int& ra=a; //referans tanımlaması
cout<<a<<endl<<pa<<endl<<ra<<endl;
a=*pa+3; //pointer ile direk bellek üzerinden işlem
cout<<a<<endl;
a=ra+3; //referans üzerinden işlem
cout<<a<<endl;
system("PAUSE");
return 0;
}pointerlar direk bellek alanını işaret ediyor,referanslar ise direk değeri veriyor. İkisi arasında anladığım kadarıyla bi yazım farklılığı var(referanslar daha sade,daha iyi), bir de pointer bellek adreslerini tutmaya yönelik değişken tipiyken referanslar değişken tipi değiller.
Bildiğim kadarıyla kullanım sebepleri;
-Belleğe direk erişim ihtiyacı.(Sisteme yönelik uygulamalar)
-Sistem gereksinimini azaltarak belleği verimli kullanma.(dolayısıyla performansı arttırma)
eğerki bir değişkeni işaret etmeyeceksek,amacımız sadece heap bölgesinde veri tutmak ise;
int* pointer_adi = new int;
şeklinde bir tanımlama yapıp, daha sonra aldığımız bellek alanına *pointer_adi = 64654 gibi bir atama yapabiliriz.
*Başlangıç için yazdım. Eksik gedik illaki var, detaylı bilgi için google.com
-
Hocam zaten okullarda ve turkce kaynaklardada hep bunları gösterıyorlar ilerisi yok bu pointerler cok onemlı denıyor ama bu kadar onemlı yapan bı ornek yokmu merak edıyorum nerde nasıl kullanılıyor
-
Tam net bir bilgi veremiycem ama googleda araştırınca ceviz.netten falan Tr biraz bilgi geliyor. Yabancı kaynak için de "Pointers on C - Kenneth Reek" var.
Hani elimdeki en somut örneği şu; oyunlarda bazı hileler için memory hacking denen bir yöntem kullanılıyor. Mesela oyun içinde otomatik pot basma işlemi gerçekleştireceksin, bunun için can değerini saklayan değişkeni alırsan oyunu kapattıktan sonra yazdığın uygulama işe yaramaz çünkü değişken adı değişiyor(tam bilmiyorum fazla araştırmadım ama böyle birşey aşağı yukarı), bu işlem için o değişkenin bellekte hangi depolama alanını işaret ettiğini bulup ordan o değeri bir pointer aracılığı ile alman gerekiyor. Gerisi zaten tuş vuruşu göndermek :)
-
İlk bakışta karışık gelmesine rağmen pointer işlemleri oldukça kolaydır.
Ben şöyle alıştırmıştım kendimi mesela, * görünce pointer diye oku, & gördüğünde addressof diye oku. ikisi birbirinin tersi işte.
pointer dediğimiz ramdaki kaçıncı byteda olduğunu gösteren sayı.
Kullanım amacını ise kodun assemblye nasıl dönüştüğünü anlayınca anlarsınız.
hafızadaki bir bölgeyi tek tek bir değişkenin gösterdiği adrese kopyalayıp değişkenden okuyup bunu başka bir alana yazıp oradan okuyup hedef alana yazıp hedef alan adresini gösteren değişkeni yeni yazılacak bölgeye atamak var, bir diğer yöntem olarak da sadece iki tarafın pointer adreslerini kaydırıp birbirlerine yazmak var. Burada pointerlar doğru kullanıldığında acaip bir performans farkı oluşuyor.
Pointerların bir başka kullanımı da winapiler, dlller arasında değişken boyutlu variablelar göndermek. Herhangi bişeyin adresini birbirini anlamayan iki platform arasında alıp verebilirsiniz. Boyutunu da yanında gönderince karşı tarafın bunu okumasında problem olmaz
-
Memory içindeki bir adresi bu şekilde değiştirebilir miyiz? Yani, ReadProcessMemory vs. gibi winapiler olmadan?
Waze tarafından 07/Eki/12 12:09 tarihinde düzenlenmiştir -
-
Waze bunu yazdı
Memory içindeki bir adresi bu şekilde değiştirebilir miyiz? Yani, ReadProcessMemory vs. gibi winapiler olmadan?
detaylı bakmadım rpm fonksiyonuna ama bi tutorial inceledim, pointerlarda olduğu gibi hexadecimal bellek adresini gösterip değer alıyorsun, sanırım aynı şeyi yapabiliyorsun.
@spark: okuduğumu anlıyorumda,bilmediğim kelimeler yüzünden listeningde sıkıntım var :D