#include <iostream> // cin, cout et cerr.

using namespace std ;

int d1 ; // Une première variable entière globale.
int d2 ; // Une seconde variable entière globale.

// Retourne l'adresse de la variable passée en argument.
size_t
adresse(int & i)
{
	// Conversion douteuse qui nécessite un `reinterpret_cast'.
	return reinterpret_cast<size_t>(& i) ;
}
int
main()
{
	int d3 ; // Une première variable entière locale.
	int d4 ; // Une deuxième variable entière locale.
	int & d5 = * new int ; // Une première variable entière allouée sur le tas.
	int & d6 = * new int ; // Une seconde variable entière allouée sur le tas.

	cout << "Adresse de d1 " << adresse(d1) << endl ;
	cout << "Valeur de  d1 " << d1 << endl ;
	cout << "Adresse de d2 " << adresse(d2) << endl ;
	cout << "Valeur de  d2 " << d2 << endl ;
	cout << "Adresse de d3 " << adresse(d3) << endl ;
	cout << "Valeur de  d3 " << d3 << endl ;
	cout << "Adresse de d4 " << adresse(d4) << endl ;
	cout << "Valeur de  d4 " << d4 << endl ;
	cout << "Adresse de d5 " << adresse(d5) << endl ;
	cout << "Valeur de  d5 " << d5 << endl ;
	cout << "Adresse de d6 " << adresse(d6) << endl ;
	cout << "Valeur de  d6 " << d6 << endl ;
	{
		int d7 ; // Une troisième variable entière locale.
		cout << "Adresse de d7 " << adresse(d7) << endl ;
		cout << "Valeur de  d7 " << d7 << endl ;
	}
	{
		int d8 ; // Une quatrième variable entière locale.
		cout << "Adresse de d8 " << adresse(d8) << endl ;
		cout << "Valeur de  d8 " << d8 << endl ;
	}
	return 0 ; // Retour au système d'exploitation avec le code `0'.
}
