difference between * and & in c++

#include <iostream>


using namespace std;


int main() {

    int val = 5;

    int& rref = val;

    int* ptr = &val;

    

    cout<<"in main"          << endl

        << "val   =  "   << val   << endl

        << "&val  =  "   << &val  << endl

        << "rref  =  "   << rref  << endl

        << "&rref =  "   << &rref << endl

        << "ptr   =  "   << ptr   << endl

        << "*ptr  =  "   << *ptr  << endl

        << "&ptr  =  "   << &ptr  << endl;

/*

in the aspect of the appearance of code and undrestanding the code via the way it looks like for human/abstract(somehow)

this example shows that in c++ mentionning the name of rref in a function such as ccout is equvalent/printing the original value (val==rref)

and mentionning &rref is equvalent to address of original  ((&val) or (&val==&rref))

while

mentioning the name of ptr is equvalent to address of original  ((&val) or (&val==ptr))

and mentioning *ptr is equvalent to the original value (val==*ptr)

however there is one more : that is &ptr that is not equvalent to any of those in the above. 

by some thinking even without reading from books and writtens we can come this point that : probably that is because pointer variable itself has an extra allocation compare to refrence therfore in another language pointer is a rference to refernce (somehow even if not exactly)

terminologies might not be enough accurate and precise ... please try to rethink it.

*/

    return 0;

}