When the operator new is used, there is no way to be sure what actual address will result. However, because there is no delete [] between the first and second use of new, the two addresses have to be different, as the first block of memory is still in use, so of course a different address will result the second time.
You could (and indeed should) release the memory when it is no longer in use, or the program will have a memory leak.
int main()
{
int st=5;
int * z;
// first time
z=po(st);
cout << "main 1" << endl;
cout<<z[0]<<" "<<z[1]<<" "<<z[2]<<endl;
cout<<&z[0]<<" "<<&z[1]<<" "<<&z[2]<<endl;
delete [] z; // release the block of memory
z = NULL; // set the pointer to NULL as that address is no longer valid.
// second time
z=po(st);
cout << "main 2" << endl;
cout<<z[0]<<" "<<z[1]<<" "<<z[2]<<endl;
cout<<&z[0]<<" "<<&z[1]<<" "<<&z[2]<<endl;
delete [] z; // release the block of memory
z = NULL; // set the pointer to NULL as that address is no longer valid.
return 0;
}