解引用指针构造的地址

Address of dereferenced pointer construct

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 吗?

Is &(*pVm) equivalent to pVm?

是的。 *1

*(&pVm) 相同。


(*1) 由于 *-operator (de-referencing) 仅适用于指针,前者构造仅适用于指针(或数组,这将衰减为指针它的第一个元素)。后者可以应用于任何类型的变量。:

引用 C11,章节 §6.5.3.2,地址和间接运算符

[...] If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue. [...]

所以,,它们等价

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

The operand of the unary * operator shall have pointer type.

因此,构造 &(*pVm)

    如果 pvm 是指针或数组名称,
  • 就可以了。
  • 如果pvm是非指针类型的变量,会产生编译错误。

有关代码示例,请参阅

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

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

#include <stdio.h>

struct t {
    int value;
};

typedef struct t t;

int func(t *ptr)
{
    return ptr->value;
}

int main(void)
{
    t o = {.value = 0};
    t v[2] = {{.value = 1}, {.value = 2}};

    printf("%d\n", func(&(*o))); /* error: invalid type argument of unary ‘*’ */
    printf("%d\n", func(&(*v))); /* WORKS */
    return 0;
}