8

unqlite c 库中,我发现以下代码:

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

哪里pVm是:

typedef struct jx9_vm jx9_vm;
jx9_vm *pVm

并且调用的函数声明为:

jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);

在 call 中使用什么 for 构造&(*pVm)而不是 just pVm&(*pVm)相当于pVm?_

4

3 回答 3

12

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

[...]如果操作数是一元运算符的结果,则该运算*和运算符都不会&被计算,结果就像两者都被省略了一样,除了对运算符的约束仍然适用并且结果不是左值. [...]

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

但是,此构造可用于根据指针类型检查参数的类型。从一元*算子的性质来看,

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

所以,构造&(*pVm)

  • 会很好,如果pvm是指针或数组名称。
  • pvm如果是非指针类型变量,将产生编译器错误。

有关代码示例,请参见Alter Mann 的另一个答案。

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

于 2016-08-12T10:01:23.493 回答
5

&(*pVm)相当于pVm?_

是的。*1

*(&pVm).


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

于 2016-08-12T09:59:29.913 回答
3

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

#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;
}
于 2016-08-12T10:07:57.020 回答