If we ignore the aspects:
- Bad practice
- Unjustified need
- and probably others ...
What are the risks (run-time : crash, undefined behavior, segmentation fault. implementation-defined behavior : wrong address generation) of this program as long as the address remains in the interval INT_MIN and INT_MAX:  
#include <iostream>
using namespace std;
#include <sstream> 
#include <string>  
#define TAB_SIZE 2
void UseIntAsAdress (unsigned int  i)
{
    int *pTab =  (int*) i;
    for (int i=0; i< TAB_SIZE; i++)
        cout << "tab ["<<i<<"] = "<< pTab[i] <<endl;
}
int main()
{
    int *pTab = new int [TAB_SIZE];
    for ( int i=0; i<TAB_SIZE; i++)
        pTab [i] = i; 
    std::stringstream streamAdr;
    streamAdr << pTab;  
    std::string name = streamAdr.str(); 
    unsigned int i = stoi(name.c_str(), 0, 16);
    UseIntAsAdress (i);
    delete [] pTab;
    return 0;
}
 
    