首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >取消引用指针结构的地址

取消引用指针结构的地址
EN

Stack Overflow用户
提问于 2016-08-12 09:57:25
回答 2查看 1.6K关注 0票数 8

unqlite c库中,我发现了以下代码:

代码语言:javascript
复制
 pObj = jx9VmReserveMemObj(&(*pVm),&nIdx);

其中pVm是:

代码语言:javascript
复制
typedef struct jx9_vm jx9_vm;
jx9_vm *pVm

被调用的函数声明为:

代码语言:javascript
复制
jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *);

在调用中使用什么来构造&(*pVm)而不仅仅是pVm&(*pVm)等价于pVm吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-12 10:01:23

引用C11,第6.5.3.2章,地址和间接运算符

..。如果操作数是一元*运算符的结果,则不计算该运算符或*运算符,其结果就好像两者都被省略了一样,但对运算符的约束仍然适用于,并且结果不是lvalue。

所以,是,它们是等价的。

但是,此构造可用于对照指针类型检查参数的类型。根据一元*算子的性质,

一元*运算符的操作数应具有指针类型。

因此,构造&(*pVm)

  • 如果pvm是指针或数组名,就可以了。
  • 如果pvm是非指针类型变量,则会生成编译器错误.

请参阅the other answer by Alter Mann中的代码处理示例。

另一个不同之处(一般情况下)是,pVm可以被分配(可以用作赋值操作符的LHS ),但是&(*pVm)不能。

票数 12
EN

Stack Overflow用户

发布于 2016-08-12 10:07:57

是的,它们是相同的,但是请注意,当对象不是数组或指针时,它会失败:

代码语言:javascript
复制
#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;
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38915128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档