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, указателю второго порядка, а точнее значению, на которое казывает область памяти перемененной, было присвоино значение области памяти выделенной под указатель первого порядка