Что вам следует понять, так это то, что указатель является адресом. Это означает, что он говорит, что «данные для объекта на самом деле там». Поэтому вы должны разделить, меняете ли вы переменную или память.
Когда вы разыменовываете указатель и присваиваете ему изменяемую память, а не переменную.
int **x;
int **p;
int *q;
время диаграммы блока:
+-----------+ +------+ +-----+
| x (**int) | -> | *int | -> | int |
+-----------+ +------+ +-----+
Скажите, что я пишу в первое поле: x = p
+-----------+ +------+ +-----+
| x (**int) | XX | *int | -> | int |
+-----------+ +------+ +-----+
\
\ +------+ +-----+
-> | *int | -> | int |
+------+ +-----+
Скажите, что я пишу во второе поле: *x = q
+-----------+ +-----------+ +-----+
| x (**int) | -> | (*x) *int | XX | int |
+-----------+ +-----------+ +-----+
\
\ +-----+
-> | int |
+-----+