通常是因为,希望别人给自己的一个指针赋值。
比如 COM 接口的指针是 void* 类型,获取 COM 接口的函数的参数就是 void**。
当然了,这个东西,需要你有更多实践,理解更加深入后,自然就逐渐理解了。
现在我再次举这个简单例子来说明它。画一个地址大小为 1byte 的内存空间:
| addr | value |
|------|-------|
| 20 | 0A | ch1 ←-┐
|------|-------| │
| 21 | CC | │
|------|-------| │
| 22 | 20 | p1 --┘ ←--┐
|------|-------| │
| 23 | 22 | pp1 --------┘
|------|-------|
现在我们假设有一个变量
char ch1 = 0x0A; // 假设 ch1 的地址位于 20H: m[20H] = 0AH;
char* p1 = &ch1;
char** pp1 = &p1;
假设内存空间,我们看做一个数组: char[ ]; 为这个数组取个名字叫做 m,例如:
char m[256];
现在我们得到那个 0x0A ,就可以通过
char ch2 = **pp1;
因此,我们就可以理解成:
char ch2 = m[ m[ pp1 ] ]; //解二级指针引用。
这是二级指针;
--------------------
同样,
char ch3 = *p1;
可以理解成:
char ch3 = m[ p1 ]; //解指针引用
OK,在汇编层面,就是这样(在汇编语言中,没有 m,只会出现 [ ]) 。比如说:
MOV EAX, [ EDX + 8 ]
CALL EAX
你该 get 它了。