2014-11-20 123 views
0

关于此主题有许多线程,其中一些有帮助,但我需要一些特定的帮助。C结构和指针混淆

说我们有这样的代码:

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

struct other { 
    int d; 
} 

所以,我们已经有了一个结构称为A,含一个int(称为B)和指针类型 “其他”,名为c的结构。

现在说以后我们有:

A* pA; 

我们假设点A.

我的第一个问题是正确分配的实例,我如何访问“d”?我已经试过:

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

但我得到一个编译错误关于“(”令牌之前应有一个标识符

我的第二个问题是,什么是指数据类型为A VS之间的差异。 。A_t?换句话说,我们将结构定义为类型A,但在定义的末尾有“A_t”部分。我对它的内容有了很多模糊的描述,但我没有明白,好像我们只是随机决定用两个不同的名字来调用相同的数据类型,为了好玩。

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

我很感激!

+0

'INT Z = PA-> C-> d;''型A'未C. – BLUEPIXY 2014-11-20 19:14:47

+0

定义这一行:A * pA;会引发编译器错误。也许你的意思是:A_t pMyA; - 或 - struct A pMyA;注意,你不应该使用struct的名字作为结构 – user3629249 2014-11-20 22:45:51

+0

的一个实例的名字,你可以尝试:int z =(pMyA-> c) - > d; (请参阅我之前关于A结构实例名称的评论。 – user3629249 2014-11-20 22:50:36

回答

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. 
+0

超级方便,谢谢Brian。后续问题,如果需要,还可以将A结构称为A,还是现在必须引用它?作为A_t? – 2014-11-20 19:19:41

+0

您可以将其称为“struct A”或其别名“A_t”。 – 2014-11-20 19:20:34

4

基本规则:

  • 您使用prefix- *取消引用一个指针和postfix- .来访问一个字段。
  • 后缀操作比前缀更高的优先级,所以如果你想提领先

所以采取这些考虑,你开始你的指针pA你需要括号。要取消对它的引用,以获得结构:

*pA 

然后你想要得到的c场,这将需要大约你已经拥有的括号:

(*pA).c 

现在提领,要得到other对象:

*(*pA).c 

然后拿到d场,而这又需要括号:

(*(*pA).c).d 

“取消引用然后获取字段”的这个任务非常常见,以至于有一个快捷的后缀运算符->可以一步完成并避免括号。第一DEREF pA及得到C:

pA->c 

然后再次DEREF并获得d

pA->c->d