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

shi*_*mot 7 c syntax pointers addressof dereference

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

 pObj = jx9VmReserveMemObj(&(*pVm),&nIdx);
Run Code Online (Sandbox Code Playgroud)

在哪里pVm:

typedef struct jx9_vm jx9_vm;
jx9_vm *pVm
Run Code Online (Sandbox Code Playgroud)

和被调用的函数声明为:

jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);
Run Code Online (Sandbox Code Playgroud)

什么构造&(*pVm)用于呼叫而不是只是pVm?是&(*pVm)相当于pVm

Sou*_*osh 9

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

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

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

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

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

所以,构造 &(*pVm)

  • 没问题,如果pvm是指针或数组名称.
  • 如果pvm是非指针类型变量,将生成编译器错误.

请参阅Alter Mann的其他答案,以获取代码示例.

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

  • "*所以,差异......*"在OP的例子中无关紧要. (2认同)

alk*_*alk 5

&(*pVm)相当于pVm

是。* 1

相同*(&pVm)


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