Я хотел бы поделиться общей техникой, которую я использовал, чтобы узнать, как работают указатели, когда я только начинал.Если вы примените его к своей проблеме, вы увидите, что ответ прост, как день.
Возьмите большой лист миллиметровки и положите его вдоль стола перед собой.Это память вашего компьютера.Каждый блок представляет один байт.Выберите строку и поместите число «100» под полем слева.Это «самый низкий адрес» памяти.(Я выбрал 100 в качестве произвольного числа, которое не равно 0, вы можете выбрать другое.) Пронумеруйте поля в порядке возрастания слева направо.
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Теперь представьте, что int имеет размер один байт.Вы восьмибитный компьютер.Запишите свой int a
в одну из коробок.Номер под окном является его адресом.Теперь выберите другое поле, содержащее int *b = &a
.int *b
также является переменной, хранящейся где-то в памяти, и это указатель, содержащий &a
, который произносится как "адрес А".
int a = 5;
int *b = &a;
a b
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Теперь вы можете использовать эту модель длявизуально прорабатывайте любые другие комбинации значений и указателей, которые вы видите.Это упрощение (потому что, как скажут педанты языка, указатель не является обязательно адресом, а память не обязательно последовательной, и есть стек, куча, регистры и т. Д.на), но это довольно хорошая аналогия для 99% компьютеров и микроконтроллеров.
Итак, в вашем случае,
int x = 35;
int y = 46;
x y
+---+---+---+---+---+--
| 35| 46| | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
int *p = &x;
int *q = &y;
x y p q
+---+---+---+---+---+--
| 35| 46|100|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
p = q;
x y p q
+---+---+---+---+---+--
| 35| 46|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
*p = 90;
x y p q
+---+---+---+---+---+--
| 35| 90|101|101| | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
Что теперь такое *p
?Что такое *q
?