Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

C++ pointer to pointer problemi


Öne çıkan mesajlar

Mesaj tarihi:
cpp guruları şu aşağıdaki duruma hiç kafam basmadı bir bakabilirmisiniz siz


using namespace std;

typedef int T;

int main(int argc, char** argv) {

const T t = 12345;
T *pt;
const T **ppt = (const T**)&pt;
*ppt = &t;
*pt = 54321;
cout<<t<<endl;

const T *pct = &t;
cout<<t<<endl;
cout<<*pct<<endl;


return 0;
}


şimdi burda ilk anda 12345 basıyor da ikincisinde yani gidip *pct'yi bastırdığımız 54321 basıyor fikri olan var mı?
hepsi nihayetinde t adlı variable'ye ulaşmıyor mu?
Mesaj tarihi:
constların hepsini kaldırınca hep 54321 basıyor. normalde const degerlerin degismesi yasak ya böyle pointer ile kandırabiliyorduk belki compiler const degerleri bir daha kontrol edip düzeltiyordur kafasına göre.
Mesaj tarihi:
ya işte comp ne yapiyor çözemedim
acaba o t değerinin bir kopyasını mı çıkarıyor

const T **ppt = (const T**)&pt;

şu satırın da hatalı olması lazım bir de
2. ve daha üstün leveldaki pointerlarda normal bir değeri const'a atayamamız lazım aslında, ama buna da izin veriyor. zaten (const T**) zorlamayınca izin vermedi :)
Mesaj tarihi:
compiler direk hafızaya alıyor t yi, adresse ulaşmadan yapıyor.

burayı anlamadım, hafızaya atıyor derken, gidip t'yi istediğimizde adresine bakmıyor mu bir daha nedir?

yani elimizde iki tane mi t olmuş oluyor const la bu şekilde yapınca
Mesaj tarihi:
evet
şöyle diyelim t yi compiler optimizasyon için belli bir yerde tutuyor. (Const dediğine göre bunu kullanma ihtimali yüksek gibi düşünüp)

sende arkalardan asıl memorydeki yerini trollüyorsun. Ama compiler hiç bakmıyor o yere çünkü değişmeyecek diye düşünüyor.

Dediğim gibi kodu


using namespace std;

typedef int T;

int main(int argc, char** argv) {

volatile const T t = 12345;
volatile T *pt;
volatile const T **ppt = (volatile const T**)&pt;
*ppt = &t;
*pt = 54321;
cout<<t<<endl;

volatile const T *pct = &t;
cout<<t<<endl;
cout<<*pct<<endl;


return 0;
}


çevir o zaman bak değerlere
Mesaj tarihi:
şimdi normalde const degerleri hiçbir şekilde degismemesi gerek.
ama böyle pointer aracılığı ile dolaylı yoldan degerini degistirebiliyoruz.
(bundan sonrası tahmin) bence yeni compilerlar bu çakallıgı engellemek için const degerleri ayrıcana tutuyor bir yerde sonradan degistirmeleri engellemek için. yani eski compilerlar ile degisik sonuçlar verebilir. alakalı bir link bulursam yollarım.
×
×
  • Yeni Oluştur...