解除引用的指针构造的地址

unqlite c库中,我找到了以下代码:

pObj = jx9VmReserveMemObj(&(*pVm),&nIdx); 

其中pVm是:

 typedef struct jx9_vm jx9_vm; jx9_vm *pVm 

和被调用的函数声明为:

 jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *); 

什么构造&(*pVm)用于调用而不仅仅是pVm&(*pVm)相当于pVm吗?

引用C11 ,章节§6.5.3.2, 地址和间接操作符

[…]如果操作数是一元*运算符的结果,那么运算符和&运算符都不会被计算,结果就好像都被省略了 ,除了对运算符的约束仍然适用且结果不是一个左值。 […]

所以, 是的 ,它们是等价的

但是,可以使用此构造来检查针对指针类型的参数类型。 从一元*运算符的属性,

一元*运算符的操作数应具有指针类型。

所以,构造&(*pVm)

  • 如果pvm是指针或数组名称,那pvm
  • 如果pvm是非指针类型变量,则会生成编译器错误。

请参阅Alter Mann的其他答案,了解代码示例。

另外一个区别( 通常 )是,可以分配 pVm (可以用作赋值运算符的LHS),但是&(*pVm)不能。

&(*pVm)相当于pVm吗?

是。 * 1

*(&pVm)


(* 1)由于* -operator( 取消引用 )仅适用于指针,因此前一种结构仅适用于指针(或数组,它将衰减为指向其第一个元素的指针)。 后者可以应用于任何类型的变量。

是的,它们是相同的,但请注意,当对象不是数组或指针时它会失败:

 #include  struct t { int value; }; typedef struct tt; int func(t *ptr) { return ptr->value; } int main(void) { to = {.value = 0}; tv[2] = {{.value = 1}, {.value = 2}}; printf("%d\n", func(&(*o))); /* error: invalid type argument of unary '*' */ printf("%d\n", func(&(*v))); /* WORKS */ return 0; }