8

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?

4

3 に答える 3

12

Quoting C11、章 §6.5.3.2、アドレスおよび間接演算子

[...]オペランドが単項演算子の結果である場合、*その 演算子も演算子も&評価されず、結果は両方が省略されたかのようになります。. [...]

そう、はい、それらは同等です。

ただし、この構成を使用して、ポインター型に対して引数の型をチェックできます。単項演算子の性質から*

単項演算子のオペランドは*ポインタ型でなければなりません。

したがって、コンストラクト&(*pVm)

  • pvmがポインタまたは配列名であれば問題ありません。
  • pvmが非ポインタ型変数の場合、コンパイラ エラーが発生します。

コード単位の例については、Alter Mann による他の回答を参照してください。

もう 1 つの違い (一般的に) は、代入pVmできます (代入演算子の LHS として使用できます) が、できません。&(*pVm)

于 2016-08-12T10:01:23.493 に答える
3

はい、それらは同じですが、オブジェクトが配列でもポインターでもない場合に失敗することに注意してください。

#include <stdio.h>

struct t {
    int value;
};

typedef struct t t;

int func(t *ptr)
{
    return ptr->value;
}

int main(void)
{
    t o = {.value = 0};
    t v[2] = {{.value = 1}, {.value = 2}};

    printf("%d\n", func(&(*o))); /* error: invalid type argument of unary ‘*’ */
    printf("%d\n", func(&(*v))); /* WORKS */
    return 0;
}
于 2016-08-12T10:07:57.020 に答える