Когда вы назначаете что-то вроде int abc = 5; int *ptr = &abc;
, понимаете, что:
ptr
- целочисленный указатель
&abc
- адрес переменной abc
ptr
хранит адреса переменной abc
- Запись
*ptr
является эквивалентом записи abc
и не совпадает с записью 5
(константа), хотя все три значения в выражении 5
.
Оператор *
разыменовывается, чтобы дать вам переменную, на адрес которой указывает ptr
(т.е. abc
). Поэтому его можно использовать как lvalue (слева от назначения).
Теперь в вашем примере, когда вы пытались присвоить x = *y
, вы пытаетесь сохранить значение, на которое указывает y
(что является целочисленным значением), до x
(которое ожидает адрес).
Теперь предположим, что вы как-то сделали назначение, давайте также предположим, что &y
(то есть адрес y) - это что-то вроде 1056
(только для примера), а значение, на которое указывает y
, - что-то вроде 5
. Затем с этого момента x
указывает на местоположение адреса 5
(которое не является фактическим адресом), что приводит к некоторому значению мусора.
Теперь назначение типа x = y
будет работать безупречно. Но это заставит указатели x
указывать на то же место, на которое указывает y
, поменять местами их наведение. Это если изначально, если x
указывал на переменную a
, которая находилась по адресу 1000
, а y
указывал на переменную b
, которая находилась по адресу 2000
, после значения присвоения обоих x
и y
будет 1000
. Это означает только то, что теперь у нас есть два указателя на переменную b
по адресу 2000
, но это не влияет на реальные переменные.
Принимая во внимание, что запись *x = *y
эквивалентна записи a = b
Надеюсь, это помогло.