我仍然在努力理解*p,&p和p之间的区别。据我了解,*可以被认为是“指向的值”,&是“地址”。换句话说,*保存值,而&保存地址。如果这是正确的,那么*p和p之间有什么区别呢?难道p不像*p一样保存某些值吗?
*
操作符用于间接寻址。间接寻址是指将 p
中的值解释为内存地址,并加载该地址处的值。当 p
是 p
的值时,*p
是指由 p
指向的内存位置中存储的值。如果要间接访问整数 i
的值,可以使用整数指针指向它(int *p = &i
),并使用该指针间接修改 i
的值(*p = 10
)。&p=0xcafebabe p=0xfeedbeef *p=0xdeadbeef <-- 内存地址因此,
+--------------+ +---------------+ +----------------+ | p=0xfeedbeef | -> | *p=0xdeadbeef | -> | **p=0x01234567 | <-- 内存内容 +--------------+ +---------------+ +----------------+
&p
是p
的地址,即0xcafebabe
。内存位置0xcafebabe
存储了p
的值,即0xfeedbeef
。这也是*p
的地址。p
的值是指向*p
的指针。&p
的值是p
的地址。
*p
的值是**p
的地址。*
和&
就像相反的操作符,*&p == p == &*p
,除非您在操作符重载时做了一些有趣的事情。int q=12;
int *p=&q;
int *pp;
pp=&q;
从技术上讲,*
和&
都不包含任何东西,因为它们都操作变量。
*
将提取值,而&
将提取地址。
挖掘指针的魔力的最佳方法是调试。指针是什么?
任何变量都位于内存中的一个地址,并且该地址包含一个具有大小(一些字节2(16位),4(32位),8(64位))的值。当该变量的值是地址值时,我们将该变量称为指针。
我希望这个指针的解释能帮助一些人更好地理解。像this这样的图形可以帮助理解指针移动时的++或--运算符。指针变量的值增加或减少,因此指针所指向的地址(指向的内存单元)在上面user3231318的表示中向上或向下移动。
**Adress|Data**
00001 |12345-----|
00002 |45678 |
12345 |99887 <---|-------|
6757 |33431 |
9987 |22894<------------|
Print(&p)----->00001
Print(p)------>12345
print(*P)----->99887
Print(**p)---->22894
p
表示数字(1-10),&p
表示我询问的那个人(1-7),而*p
则是他们选择的房子(地址为p
的房子)。 - qwertymk