#include <iostream>
using namespace std;


	

int main() {
	
	int a = 5;

	int * ptr_a;
	
	ptr_a = &a;

	int ** ptr_b;

	ptr_b = &ptr_a;
	
	/*

	Указатель ptr_a;
	Синтаксис объявления int * ptr_a;
	Указатель это переменная содержащая два значения.
	1. Это сам адресс в памяти, выделенной под этот указатель.
		&ptr_a
	2. Это адресс памяти переменной (или массива или указателя или класса) на которую указывает указатель. 
		ptr_a
	
	В данном примере, объявляется и инициализируется переменная а типа int.
	Объявляется указатель на int	int * ptr_a.
	Теперь указателю, который ссылался на случайную память в стеке (причем не инициализированную, значит он ссылался в случайное место) присваевается адресс переменной а. Синтаксис взятия адресса &a. 
	Объявляется указатель второго порядка int ** ptr_b.
	Указателю второго порядка, а точнее значению, которое указывает на область памяти переменной, теперь присваивается значение одласти памяти переменной, на которую указывает указатель ptr_a
	напомним
	int * ptr - синтаксис объявления указателя
	ptr - указатель, при выводе, вывест облась памяти переменной на которую он указывает, что бы получить значение переменной, на область памяти которой указывает указатель, используем разъименовывание указателя cout << *ptr
	&ptr - выведет область памяти, выделенной под указатель
	именно поэтому, если функция возвращает указатель int * function(){int * ptr; return ptr;} то возвращающим значением должен быть указатель (return ptr) а не (return &prt)
	*/
	

	
	std::cout << *ptr_b << std::endl;		//вывод значения переменной, на которую указывает указатель второго порядка ptr_b по средствам разъименовывания указателя *ptr_b, указателю второго порядка, а точнее значению, на которое казывает область памяти перемененной, было присвоино значение области памяти выделенной под указатель первого порядка 
	std::cout << ptr_a << std::endl;		//
	std::cout << &ptr_a << std::endl;
	std::cout << &a << std::endl;
	
	system("pause");
	return 0;
}
