In unqlite c library I found following code:
pObj = jx9VmReserveMemObj(&(*pVm),&nIdx);
where pVm
is:
typedef struct jx9_vm jx9_vm;
jx9_vm *pVm
and function called is declared as:
jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);
What for construct &(*pVm)
is used in call instead of just pVm
? Is &(*pVm)
equivalent to pVm
?
Quoting
C11
, chapter §6.5.3.2, Address and indirection operatorsSo, yes, they are equivalent.
This construct can be used, however, to check the type of the argument against a pointer type. From the property of unary
*
operator,So, the construct
&(*pVm)
pvm
is a pointer or array name.pvm
is a non-pointer type variable.See the other answer by Alter Mann for code-wise example.
One more difference (in general) is,
pVm
can be assigned (can be used as LHS of the assignment operator), but&(*pVm)
cannot.Yes. *1
Same for
*(&pVm)
.(*1) As the
*
-operator (de-referencing) only is applicable to pointers, the former construct only works on a pointer (or an array, which would decay to a pointer to its 1st element). The latter can be applied to any type of variable.:Yes, they are the same, but notice that it fails when the object is not an array or a pointer: