// adresse_variables.cpp -- coding: utf-8
#include <iostream>   // Utilisation des flux cin, cout et cerr.
#include <iomanip>    // Pour setw(...) dans les opérations de sorties.

using namespace std ; // Importer l'espace des noms de la bibliothèque standard.

double var_globale_1 = 1 ; // Une première variable statique et globale.
double var_globale_2 = 2 ; // Une seconde variable statique et globale.

// Déclaration des fonctions utilisées par la suite.
void afficher_adresse_de(const string & nom, const double & variable) ;
void une_fonction() ;

int main() {

	double var_locale_1 = 1 ;            // Une variable automatique et locale.
	const double const_var_locale = 2 ;  // Une variable automatique et locale.
	static double static_var = 3 ;       // Une variable statique et locale.

	cout << "Adresse des variables\n" ;
	afficher_adresse_de("var_globale_1", var_globale_1) ;
	afficher_adresse_de("var_globale_2", var_globale_2) ;
	afficher_adresse_de("var_locale_1", var_locale_1) ;
	afficher_adresse_de("const_var_locale", const_var_locale) ;
	afficher_adresse_de("static_var", static_var) ;

	if ( true ) {
		double var_bloc_1 = 1 ;            // Une première variable automatique.
		afficher_adresse_de("var_bloc_1", var_bloc_1) ;
		double var_bloc_2 = 2 ;            // Une seconde variable automatique.
		afficher_adresse_de("var_bloc_2", var_bloc_2) ;
	}
	if ( true ) {
		double var_autre_bloc = 1 ;        // Itou, dans un autre bloc.
		afficher_adresse_de("var_autre_bloc", var_autre_bloc) ;
	}
	une_fonction() ;
}
void afficher_adresse_de(const string & nom, const double & variable) {
	cout << setw(20) << nom << ' ' << size_t(&variable) << endl ;
}
void une_fonction() {
	double var_fonction = 1 ;            // Une variable automatique et locale.
	afficher_adresse_de("var_fonction", var_fonction) ;
}
