#include <iostream>
#include <memory>

#define print_address(x) ( std::cout << "address of " #x " is " << std::addressof(x) \
                           << " (" << std::uintptr_t( std::addressof(x) ) << ")\n" )

void foo()
{
    int foo_a = 0 ;
    static int foo_b = 1 ;
    int foo_c[5] = { 2, 3, 4, 5, 6 } ;
    print_address(foo_a) ;
    print_address(foo_b) ;
    print_address( foo_c[0] ) ;
    print_address( foo_c[1] ) ;
}

void bar()
{
    int bar_a = 0 ;
    static int bar_b = 1 ;
    static int bar_c[5] = { 2, 3, 4, 5, 6 } ;
    print_address(bar_a) ;
    print_address(bar_b) ;
    print_address( bar_c[0] ) ;
    print_address( bar_c[1] ) ;

    std::cout << "--------------------------\n" ;

    foo() ;
}

int main ()
{
    int main_a = 0 ;
    static int main_b = 1 ;
    int main_c[5] = { 2, 3, 4, 5, 6 } ;
    print_address(main_a) ;
    print_address(main_b) ;
    print_address( main_c[0] ) ;
    print_address( main_c[1] ) ;

    std::cout << "--------------------------\n" ;

    foo() ;

    std::cout << "--------------------------\n" ;

    bar() ;
}
