int *aaa; //переменная с именем aaa типа "указатель на int", расположена в некоторой ячейке памяти, выделенной на стеке
aaa = new int(6); //присваиваем переменной aaa новое значение, а именно, адрес выделенной ячейки памяти в куче, содержащей значение 6
qInfo() << aaa; // 0x6a4e50 <- узнать тот самый адрес, что мы присвоили указателю
qInfo() << *aaa; // 6 <- перейти по этому адресу и извлечь значение
qInfo() << &aaa; // 0x28fbe8 <- адрес ячейки, где лежит значение самой переменной aaa
qInfo() << &*aaa; // 0x6a4e50 <- перешли по указателю, который лежит в aaa (ячейка в куче, содержащая значение 6), потом узнали адрес этой ячейки, и конечно это тот самый адрес, по которому мы перешли
qInfo() << *&aaa; // 0x6a4e50 <- узнали адрес ячейки стека, по которому расположена переменная aaa, потом перешли по нему и извлекли значение переменной aaa. то же самое, что и просто обратиться к aaa
qInfo() << *&*&*aaa; // 6 тож самое что и выше, все &* нивелируют друг друга (переход по адресу и опять получение того же самого адреса обратно), остаётся только *aaa, ну а там лежит 6