C结构和指针混乱

时间:2014-11-20 19:11:49

标签: c pointers struct

这个主题有很多主题,其中一些很有帮助,但我需要一些特别的帮助。

说我们有这个代码:

typedef struct A {
    int b;
    struct other* c;
} A_t;

struct other {
    int d;
}

所以,我们得到了一个名为A的结构,包含一个int(称为b)和一个指向#34;其他"结构的结构的指针,称为c。

现在说我们稍后会:

A* pA;

我们假设指向正确分配的A实例。

我的第一个问题是,如何访问" d"?我试过了:

int z = (*pA).(*c).d;

但是我收到了关于在'('令牌)之前预期标识符的编译错误。

我的第二个问题是,将数据类型称为A与A_t之间的区别是什么?换句话说,我们将结构定义为类型A,但是" A_t"部分在定义的最后。我已经对它的内容进行了大量模糊的描述,但是我还没有得到它,似乎我们只是随机决定用两个不同的名字来调用相同的数据类型,这很有趣。

旁注,上面的代码并非直接来自我的项目,因此我无法保证它会产生我遇到的同样问题。这是一项任务,我想避免发布我的实际代码,所以我只是写了一些更简单但更相似的东西。

我很感激!

2 个答案:

答案 0 :(得分:4)

基本规则:

  • 您使用前缀 - *取消引用指针和后缀 - .来访问字段。
  • 后缀操作的优先级高于前缀,因此如果要先取消引用,则需要括号

因此,考虑到这些因素,您可以从指针pA开始。你想取消引用它来得到结构:

*pA

然后你想获得c字段,这将需要你已经拥有的parens:

(*pA).c

现在取消引用获取other对象:

*(*pA).c

然后获取d字段,这需要再次使用括号:

(*(*pA).c).d

此任务"取消引用然后获取字段"很常见,有一个快捷的后缀运算符->可以一步完成并避免使用括号。首先deref pA并获得c:

pA->c

然后再次deref并得到d

pA->c->d

答案 1 :(得分:3)

  

将数据类型称为A与A_t之间的区别是什么?   ...   决定用两个不同的名称调用相同的数据类型,以获得乐趣

struct A别名为A_t。对于“有趣”或通常只是方便地使用更简单的方式来引用数据类型。

这是一种解除引用成员的传统方式:

int z = pA->c->d;

来自C99§6.5.2.3:

The first operand of the -> operator shall have type ''pointer to qualified or unqualified
structure'' or ''pointer to qualified or unqualified union'', and the second operand shall
name a member of the type pointed to.