这个主题有很多主题,其中一些很有帮助,但我需要一些特别的帮助。
说我们有这个代码:
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"部分在定义的最后。我已经对它的内容进行了大量模糊的描述,但是我还没有得到它,似乎我们只是随机决定用两个不同的名字来调用相同的数据类型,这很有趣。
旁注,上面的代码并非直接来自我的项目,因此我无法保证它会产生我遇到的同样问题。这是一项任务,我想避免发布我的实际代码,所以我只是写了一些更简单但更相似的东西。
我很感激!
答案 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.