& перед переменной это взяте адреса.
Аналогия с адресом как с координатами физического обьекта работает достаточно хорошо. Вы можете записать координаты на листе бумаги и получите "указатель". Если вы запишете координаты места где храните первый лист, то вы получите указатель на указатель. Чтобы просто скопировать указатель не нужно брать его адрес.
int apple = 1;
int* poinerToApple = &apple;
//просто скопируем указатель
int* poinerToApple2 = poinerToApple;
//ожидаемо оба указывают на одно значение
//assert покажет что условие верно
assert(*PointerToApple == *PointerToApple2);
assert(*PointerToApple == apple);
assert(*PointerToApple2 == apple);
//так получим указатель на указатель
int** poinerToPointerToApple = &poinerToApple;
int** poinerToPointerToApple2 = &poinerToApple2;
//разные указатели имеют разные адреса
assert(poinerToPointerToApple2 != poinerToPointerToApple);
//но они могут указывать на один и тот же указатель
assert(*poinerToPointerToApple2 == *poinerToPointerToApple);
//и по ним мы можем добраться до исходного значения
assert(**poinerToPointerToApple2 == apple);
Вызвать переменную в общем случае нельзя. Вызвать можно функцию f() и некоторые специальные обьекты. Вы описали вывод в консоль.
int x = 5;
cout << x; //напечатает 5
cout << &x; //напечатает что-то типа 0x7fffffffd2e4