在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吗?
发布于 2016-08-12 10:01:23
引用C11,第6.5.3.2章,地址和间接运算符
..。如果操作数是一元
*运算符的结果,则不计算该运算符或*运算符,其结果就好像两者都被省略了一样,但对运算符的约束仍然适用于,并且结果不是lvalue。
所以,是,它们是等价的。
但是,此构造可用于对照指针类型检查参数的类型。根据一元*算子的性质,
一元
*运算符的操作数应具有指针类型。
因此,构造&(*pVm)
pvm是指针或数组名,就可以了。pvm是非指针类型变量,则会生成编译器错误.请参阅the other answer by Alter Mann中的代码处理示例。
另一个不同之处(一般情况下)是,pVm可以被分配(可以用作赋值操作符的LHS ),但是&(*pVm)不能。
发布于 2016-08-12 10:07:57
是的,它们是相同的,但是请注意,当对象不是数组或指针时,它会失败:
#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;
}https://stackoverflow.com/questions/38915128
复制相似问题