#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;
}