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
?
引用C11
,章节§6.5.3.2,地址和间接操作符
[...]如果操作数是一元运算
*
符的结果,那么运算符和运算符 都不会&
被计算,结果就好像都被省略了,除了对运算符的约束仍然适用且结果不是左值.[...]
所以,是的,它们是等价的.
但是,可以使用此构造来检查针对指针类型的参数类型.从一元运算*
符的属性,
一元运算
*
符的操作数应具有指针类型.
所以,构造 &(*pVm)
pvm
是指针或数组名称.pvm
是非指针类型变量,将生成编译器错误.请参阅Alter Mann的其他答案,以获取代码示例.
另外一个区别(通常)是,pVm
可以分配(可以用作赋值运算符的LHS),但&(*pVm)
不能.
是
&(*pVm)
相当于pVm
?
是。* 1
相同*(&pVm)
。
(* 1)
由于*
-operator( de-referencing)仅适用于指针,因此前一种构造仅对指针(或数组,将衰减到指向其第一个元素的指针)起作用。后者可以应用于任何类型的变量。: