Rzutowanie const_cast

0

Witam

Mam mały problem z rzutowaniem, a mianowicie przy takim rzutowaniu:

int main()
{
	const int stala = 0;
	int zmienna = 5;

	const int * wsk_st = & stala;
	int * wsk_zm = & zmienna;

	cout << & stala   << "\t" << stala   << endl;
	cout << & zmienna << "\t" << zmienna << endl << endl;

	wsk_zm = const_cast<int *>(wsk_st);

	* wsk_zm = 8;

	cout << & stala << "\t" << stala    << endl;
	cout << & zmienna << "\t" << zmienna  << endl << endl;
	cout << wsk_zm    << "\t" << * wsk_zm << endl << endl;

	system("pause");
	return 0;
}

wychodzą mi takie wyniki:

0019FB4C        0
0019FB40        5

0019FB4C        0
0019FB40        5

0019FB4C        8

Aby kontynuować, naciśnij dowolny klawisz . . .

Wytłumaczcie mi proszę, jakim to cudem wskaźnik "wsk_zm" przechowuje adres stałej "stala" a jednocześnie po wyłuskaniu pokazuje inną wartość niż ta stała !?
Wartość stałej "stala" nie uległa zmianie mimo tego, iż powinna.

Ciekawe (i to bardzo) jest też to, że po zamianie typów na double, działa prawidłowo, czyli;

int main()
{
	const double stala = 0;
	double zmienna = 5;

	const double * wsk_st = & stala;
	double * wsk_zm = & zmienna;

	cout << & stala   << "\t" << stala   << endl;
	cout << & zmienna << "\t" << zmienna << endl << endl;

	wsk_zm = const_cast<double *>(wsk_st);

	* wsk_zm = 8;

	cout << & stala << "\t" << stala    << endl;
	cout << & zmienna << "\t" << zmienna  << endl << endl;
	cout << wsk_zm    << "\t" << * wsk_zm << endl << endl;

	system("pause");
	return 0;
}

Daje wyniki:

0034FEE0        0
0034FED0        5

0034FEE0        8
0034FED0        5

0034FEE0        8

Aby kontynuować, naciśnij dowolny klawisz . . .

Czyli jak najbardziej prawidłowe.

Wszystkim z góry dzięki za udzieloną pomoc.

0

Moze wartość zmiennych po użyciu trafia do register i komputer nie szuka za drugim razem jaka wartość jest w danym miejscu pamięci tylko wrzuca tą wartość co sobie zapamiętał.

0

Miałeś rację, po takim przerobieniu

int main()
{
	volatile const int stala = 0;
	int zmienna = 5;

	volatile const int * wsk_st = & stala;
	int * wsk_zm = & zmienna;

	cout << & stala   << "\t\t" << stala   << endl;
	cout << & zmienna << "\t" << zmienna << endl << endl;

	wsk_zm = const_cast<int *>(wsk_st);

	* wsk_zm = 8;

	cout << & stala	  << "\t\t" << stala    << endl;
	cout << & zmienna << "\t" << zmienna  << endl << endl;
	cout << wsk_zm    << "\t" << * wsk_zm << endl << endl;

	system("pause");
	return 0;
}

wyniki są dobre:

1               0
0025FC78        5

1               8
0025FC78        5

0025FC84        8

Aby kontynuować, naciśnij dowolny klawisz . . .

A te adresy tych zmiennych wynoszą '1' dlatego, że kompilator te zmienne umieścił sobie w jakimś specjalnym obszarze pamięci, czy z jakiegoś innego powodu?

0

krotko mowiac - tak. stale ktorych wartosci sa znane podczas kompilacji maja prawo byc umieszczone w sekcji kodu, albo wrecz usuniete i kopiowane w miejscach uzycia

1 użytkowników online, w tym zalogowanych: 0, gości: 1