shibormot shibormot - 3 months ago 6
C Question

address of dereferenced pointer construct

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
?

Answer

Quoting C11, chapter ยง6.5.3.2, Address and indirection operators

[...] If the operand is the result of a unary * operator, neither that operator nor the & operator is evaluated and the result is as if both were omitted, except that the constraints on the operators still apply and the result is not an lvalue. [...]

So, 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,

The operand of the unary * operator shall have pointer type.

So, the construct &(*pVm)

  • will be fine, if pvm is a pointer or array name.
  • will generate compiler error, if 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.