#include <iostream>
using namespace std;
int main()
{
//Пример раз.
int a = 10;
int *p = &a;
int **dp = &p;
cout << "Указатель *p = " << *p << endl;
cout << "Он указывает на адрес p = " << p << endl;
cout << "Адрес самого указателя &p = " << &p << endl;
cout << endl;
cout << "Двойной указатель **dp = " << **dp << endl;
cout << "Он указывает на переменную 'a' с адресом *dp = " << *dp << endl;
cout << "И на поинтер p с адресом dp = " << dp << endl;
cout << "Адрес самого двойного указателя dp = " << &dp << endl;
cout << endl;
//Пример два.
int A[2][2];
A[0][0] = 20;
cout << "У нас есть двумерный массив A c адресом &A = " << &A << endl;
cout << "В этому адресу находится указтель на адрес A = " << A << endl;
cout << "Значение этого указателя *A = " << A << endl;
cout << "Первый элемент массива равен **A = " << **A << endl;
cout << "Вопрос: при разворачивании указателя с адресом " << A << " на адрес " << A << " мы естесвенно получаем значение\n" \
"самого А, т.е. " << *A << ", однако при двойном разворачивании, \n" \
"т.е. получении значения все по тому же адресу мы получаем значение " << **A <<endl;
cout << endl;
//Омский код.
int s = 30;
int *j = &s;
int **i = &j;
i = (int**) &i;
cout << "&i = " << (int)&i <<endl;
cout << "i = " << (int)i <<endl;
cout << "*i = " << (int)*i <<endl;
cout << "**i = " << (int)**i <<endl;
cout << "***i = " << (int)***i <<endl;
}