解除引用的指针构造的地址
在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; }