如果你在谈论C,那么指针只代表另一个间接层.
如果将变量a视为整数,&a(地址a)是位置,它包含该位置的值a.使用时a,您将从地址中获取值.
使用指针变量p时,也会从某个位置获取值.但是该位置的价值是另一个可以获得价值的位置.
所以,假设你有:
int a = 7; // set a to 7.
int *p = &a; // set p to the address of a.
Run Code Online (Sandbox Code Playgroud)
在此示例中,a堆栈上的变量位于0x1234,p位于堆栈的0x1236位置(16位int /指针系统).你记忆中的内容是:
+--------+
0x1236 (p) | 0x1234 |
+--------+
0x1234 (a) | 0x0007 |
+--------+
Run Code Online (Sandbox Code Playgroud)
当你使用a时,例如:
int b = a;
Run Code Online (Sandbox Code Playgroud)
的值a在存储器位置0x1234的用于设置b.但是,用指针:
int c = *p;
Run Code Online (Sandbox Code Playgroud)
首先查找p内存位置0x1236(值为0x1234)的值,然后取消引用它(带'*')以获取值a.
"2部分"是一种奇怪的谈论方式.变量有一个值,位于内存中的某个位置.因此,例如,在地址0x0004处,您可以获得值7(变量v).
指针是包含地址的变量.因此,例如,在地址0xff0c处,您可以使用值0x0004(指针p).
在C:
v是7
&v(v的地址)是0x0004
p是0x0004
&p(p的地址)是0xff0c
*p(p指向的元素)是7
在实践中,您永远不必担心实际的地址,只需要担心关系.不要犹豫,写一些程序,包含非常简单的变量和变量指针,打印值,地址和解引用,我发现它在澄清指针方面有很大帮助.