#include using namespace std; // déclare une variable 'var' de type 'type' #define declare_var( var, type ) type var // déclare un pointeur 'ptr' de type 'type' #define declare_ptr( ptr, type) type *ptr // déclare un pointeur vers un pointeur #define declare_ptr_ptr( ptrptr, type ) type **ptrptr // donne le contenu du pointeur 'ptr' #define contenu_ptr( ptr ) (*ptr) // donne l'adresse de la variable 'var' #define adresse_var( var ) (&var) // fait pointer le pointeur 'ptr' sur la variable 'var' #define pointe_sur( ptr, var) ptr = &var // donne le nom de la variable, son adresse et sa valeur // qu'il s'agisse d'une variable entière ou d'un pointeur #define examine(x) \ cout << #x << " (adresse=" << &x << ") = " << x << endl; /** * Programme principal * */ int main( ) { // on définit deux entiers declare_var( a, int ); declare_var( b, int ); a = 1; b = 5; cout << "=======================" << endl; cout << "Initialement" << endl; cout << "=======================" << endl; examine( a ); examine( b ); // on déclare un pointeur sur un entier declare_ptr( p, int ); // on aurait pu écrire également : p = adresse_var( a ) pointe_sur( p, a ); contenu_ptr( p ) = contenu_ptr( p ) + 1; cout << endl; cout << "=======================" << endl; cout << "Utilisation de int *p" << endl; cout << "=======================" << endl; cout << "| int *p = &a;" << endl; cout << "| *p = *p + 1;" << endl; cout << "-----------------------" << endl; examine( a ); examine( b ); examine( p ); cout << endl; cout << "=======================" << endl; cout << "Utilisation de int **q" << endl; cout << "=======================" << endl; cout << "| int **q = &p;" << endl; cout << "| p = &b;" << endl; cout << "| **q = 7;" << endl; cout << "-----------------------" << endl; declare_ptr_ptr( q, int ); pointe_sur( q, p ); pointe_sur( p, b ); contenu_ptr( contenu_ptr( q ) ) = 7; examine( a ); examine( b ); examine( p ); examine( q ); return 0; }