То, что вы на самом деле делаете, это не с указателем на себя. Вы используете пространство памяти, выделенное для указателя, для хранения местоположения указателя . Указатель на int указывает на целые, а не на другие указатели на целые, включая самого себя.
Например, допустим, вы создали указатель a
:
int * a;
Он получает свое место в памяти:
4 a (5) 6
[....][00000000][....]
В этом простом примере, скажем, a находится в ячейке памяти '5'.
Если бы вы это сделали:
a = (int*)&a;
... произойдет следующее:
4 a (5) 6
[....][00000005][....]
То, что здесь происходит, это то, что a
указывает на то, что, по его мнению, является целым числом в местоположении 5. Это также происходит с тем же местом памяти, на которое указывает &a
, но в контексте того, что a
указывает на, теперь он указывает на целое число в местоположении 5 - и это целое число составляет 5.
Например, оба из них будут работать:
cout<<(int)a;//outputs 5
cout<<*a;//Outputs the integer at memory location 5 - which is 5.
Если вы хотите создать указатель на a, вы определенно можете это сделать одним из следующих способов:
int **b = (int**)a;
или
int ** b = &a;
Но очень важно понимать, что a
не является указателем на себя. Это указатель на целое число в расположении, в котором он хранит - который просто совпадает с его собственным местоположением.
Чтобы дополнительно показать (на еще более простом примере), что происходит, нечто подобное может произойти с int
. То есть вы можете хранить ячейку памяти int
внутри себя:
int a=999;
a
теперь имеет место в памяти и имеет значение 999 (предположим, оно было помещено в ячейку памяти '46'):
45 a (46) 47
[....][00000999][....]
Он находится в местоположении '46' - если бы мы хотели, мы могли бы сохранить это число как целое число в a
:
a=(int)&a;
45 a (46) 47
[....][00000046][....]
и теперь a
равно &a
по значению, но не по типу - a
это просто целое число, оно не указывает на себя магическим образом только потому, что мы его использовали хранить собственную ячейку памяти.