C语言中的互指结构 请解释这些结构声明-它们有效吗 这类声明是否适用?如果适用,你能举个例子吗 这些是自指结构吗
它在过程语言(如C语言中的互指结构 请解释这些结构声明-它们有效吗 这类声明是否适用?如果适用,你能举个例子吗 这些是自指结构吗,c,C,它在过程语言(如C)中无效且不需要。(在执行惰性计算的语言中可能很有用,例如:Haskell) 想象一下您的示例的一个用例 struct A { struct B b; }; struct B { struct A a; }; 但有时您需要将A和B类型的结构相互引用,在这种情况下,您可以使用指针 struct A { struct B b; }; struct B { struct A a; }; Struct A a; a.b.a.b.a.b.......[inf
C
)中无效且不需要。(在执行惰性计算的语言中可能很有用,例如:Haskell
)
想象一下您的示例的一个用例
struct A {
struct B b;
};
struct B {
struct A a;
};
但有时您需要将A
和B
类型的结构相互引用,在这种情况下,您可以使用指针
struct A {
struct B b;
};
struct B {
struct A a;
};
Struct A a;
a.b.a.b.a.b.......[infinitely]
现在,可能的用例是:
struct child;
struct parent;
struct child {
...
struct parent *pParent;
};
struct parent {
...
struct child *children[2];
};
在C
中,字段不能有[a],但允许字段作为指向不完整类型的指针
关于自引用结构,使用指针,可以实现此要求
struct child pikachu;
...
if(pikachu.pParent != NULL) {
struct child *pPikachuSibling;
pPikachuSibling = (pikachu.pParent.children[0] == &pikachu) ?
pikachu.pParent.children[1] :
pikachu.pParent.children[0];
if(pPikachuSibling != NULL) {
do_something_with(pPikachuSibling);
}
}
[a] 引用自
ISO/IEC 9899:TC2委员会草案-2005年5月6日WG14/N1124
109)不完整类型只能在不需要该类型对象的大小时使用。事实并非如此
例如,当typedef名称被声明为结构或联合的说明符时,或者
声明指向结构或联合的指针或返回结构或联合的函数时。(参见不完整类型)
在调用或定义此类函数之前,必须完成规范
6.2.5类型
22大小未知的数组类型是不完整的类型。它是
对于该类型的标识符,通过在
后期声明(具有内部或外部链接)。结构或
未知内容的联合类型(如6.7.2.3所述)是
不完整类型。对于该类型的所有声明,
通过声明与其定义内容相同的结构或联合标记
后来在同一范围内
试着想象一下如果你能做到这一点会发生什么。它的大小将是无限的。@RetiredInja或零大小!为什么?假设你没有回答某类测验,你需要为这个问题添加一些上下文以使其有意义,并且比你的一些努力更能让问题被接受。因此,使用口袋妖怪+1。
assert( pikachu.pParent.children[0] == &pikachu) ||
pikachu.pParent.children[1] == &pikachu) );