解引用指针构造的地址
Address of dereferenced pointer construct
在 unqlite c 库中我找到了以下代码:
pObj = jx9VmReserveMemObj(&(*pVm),&nIdx);
其中 pVm
是:
typedef struct jx9_vm jx9_vm;
jx9_vm *pVm
调用的函数声明为:
jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);
调用中使用的结构 &(*pVm)
而不仅仅是 pVm
是什么? &(*pVm)
等同于 pVm
吗?
Is &(*pVm)
equivalent to pVm
?
是的。 *1
与 *(&pVm)
相同。
(*1)
由于 *
-operator (de-referencing) 仅适用于指针,前者构造仅适用于指针(或数组,这将衰减为指针它的第一个元素)。后者可以应用于任何类型的变量。:
引用 C11
,章节 §6.5.3.2,地址和间接运算符
[...] 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. [...]
所以,是,它们等价。
但是,可以使用此构造来根据指针类型检查参数的类型。来自一元 *
运算符的 属性,
The operand of the unary *
operator shall have pointer type.
因此,构造 &(*pVm)
如果 pvm
是指针或数组名称,- 就可以了。
- 如果
pvm
是非指针类型的变量,会产生编译错误。
有关代码示例,请参阅 。
另一个区别(一般)是,pVm
可以分配(可以用作赋值运算符),但 &(*pVm)
不能。
是的,它们是一样的,但请注意,当对象不是数组或指针时,它会失败:
#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;
}
在 unqlite c 库中我找到了以下代码:
pObj = jx9VmReserveMemObj(&(*pVm),&nIdx);
其中 pVm
是:
typedef struct jx9_vm jx9_vm;
jx9_vm *pVm
调用的函数声明为:
jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);
调用中使用的结构 &(*pVm)
而不仅仅是 pVm
是什么? &(*pVm)
等同于 pVm
吗?
Is
&(*pVm)
equivalent topVm
?
是的。 *1
与 *(&pVm)
相同。
(*1)
由于 *
-operator (de-referencing) 仅适用于指针,前者构造仅适用于指针(或数组,这将衰减为指针它的第一个元素)。后者可以应用于任何类型的变量。:
引用 C11
,章节 §6.5.3.2,地址和间接运算符
[...] 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. [...]
所以,是,它们等价。
但是,可以使用此构造来根据指针类型检查参数的类型。来自一元 *
运算符的 属性,
The operand of the unary
*
operator shall have pointer type.
因此,构造 &(*pVm)
-
如果
- 就可以了。
- 如果
pvm
是非指针类型的变量,会产生编译错误。
pvm
是指针或数组名称,有关代码示例,请参阅
另一个区别(一般)是,pVm
可以分配(可以用作赋值运算符),但 &(*pVm)
不能。
是的,它们是一样的,但请注意,当对象不是数组或指针时,它会失败:
#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;
}