我仍在努力理解* p,& p和p之间的区别。根据我的理解,*可以被认为是“价值指向”,而且&作为“地址”。换句话说,*保持价值而&持有地址。如果这是真的,那么* p和p之间的区别是什么?是不是p持有某些东西的价值,就像* p?
一样答案 0 :(得分:7)
*
运算符用于间接。间接意味着p
中的值被解释为内存地址,并加载该地址的值。 p
是p
的值,而*p
是p
指向的内存位置中存储的值。如果要间接访问整数i
的值,可以使用指向它的整数指针(int *p = &i
)并使用该指针间接修改i
的值({ {1}})。
答案 1 :(得分:5)
这是一张图。
&p=0xcafebabe p=0xfeedbeef *p=0xdeadbeef <-- memory address +--------------+ +---------------+ +----------------+ | p=0xfeedbeef | -> | *p=0xdeadbeef | -> | **p=0x01234567 | <-- memory contents +--------------+ +---------------+ +----------------+
因此,&p
是p
的地址,即0xcafebabe
。内存位置0xcafebabe
存储p p
的值,即0xfeedbeef
。这也是*p
的地址。
请在我之后重复:p
的值是*p
的地址。
而且,&p
的值是p
的地址。
而且,*p
的值是**p
的地址。
依此类推。因此,*
和&
就像对立面一样,*&p == p == &*p
,除非您通过运算符重载执行有趣的事情。
答案 2 :(得分:1)
我给你举个例子:
int q=12;
int *p=&q;
int *pp;
pp=&q;
技术上*
和&
没有任何内容,因为它们都对变量进行操作。
*
将提取值,&
将提取地址。
挖掘指针魔力的最好方法是调试。
答案 3 :(得分:0)
**Adress|Data**
00001 |12345-----|
00002 |45678 |
12345 |99887 <---|-------|
6757 |33431 |
9987 |22894<------------|
Print(&p)----->00001
Print(p)------>12345
print(*P)----->99887
Print(**p)---->22894
答案 4 :(得分:0)
什么是指针?
任何变量都位于内存中的地址中,此地址包含一个大小(某些字节为2(16位),4位(32位),8位(64位))的值。当此变量的值是adresse值时,我们将此变量称为指针。
我希望对指针的这种解释将有助于一些人更好地理解。像this这样的绘图有助于理解指针移动时的++或 - 运算符。指针变量的值增加或减少,因此指针指向的地址(指向的存储单元)在上面的user3231318表示中向上或向下移动