我想分享一个通用技术,当我开始学习指针的工作原理时,我使用该技术。如果你把它应用到你的问题上,你会看到答案一清二楚。
拿一张大方格纸,将它纵向放在你面前的桌子上。这是您计算机的内存。每个框代表一个字节。选择一行,然后将数字“100”放在最左边的方框下方。这是内存的“最低地址”。 (我选择了 100 作为非 0 的任意数字,您可以选择另一个。)从左到右按升序对框进行编号。
+---+---+---+---+---+--
| | | | | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
现在,暂时假设一个 int 的大小是一个字节。你是一台八位计算机。将您的int a 写入其中一个框中。方框下方的数字是它的地址。现在选择另一个框来包含int *b = &a。 int *b也是存储在内存某处的变量,它是一个包含&a的指针,读作“a的地址”。
int a = 5;
int *b = &a;
一个
+---+---+---+---+---+--
| 5 | |100| | | ...
+---+---+---+---+---+--
100 101 102 103 104 ...
现在您可以使用此模型直观地处理您看到的任何其他值和指针组合。这是一种简化(因为正如语言学究所说,指针不是必要地址,内存也不是必要连续的,并且有堆栈、堆和寄存器等等),但对于 99% 的计算机和微控制器来说,这是一个很好的类比。
所以在你的情况下,
int x = 35;
int y = 46;
xy
+---+---+---+---+---+--
| 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 是什么?