结构体嵌套
结构体可以嵌套其他结构体,形成层次化的数据组织。嵌套可以是完整的结构体实例(值嵌套),也可以是结构体指针(引用嵌套)。值嵌套内联存储,引用嵌套通过指针链接。
值嵌套
struct Point {
int x;
int y;
};
struct Rectangle {
struct Point top_left; /* 值嵌套 */
struct Point bottom_right;
};
struct Rectangle r = {{0, 0}, {100, 100}};
sizeof(struct Rectangle); /* sizeof(struct Point) * 2 */
引用嵌套
struct Node {
int data;
struct Node *next; /* 引用嵌套 */
};
struct Node n1 = {10, NULL};
struct Node n2 = {20, NULL};
n1.next = &n2; /* 链接 */
自引用
struct TreeNode {
int data;
struct TreeNode *left; /* 自引用 */
struct TreeNode *right;
};
不完整类型嵌套
struct A; /* 不完全声明 */
struct B {
struct A *pa; /* 可以:指针大小已知 */
};
struct A {
int x;
struct B *pb;
};
常见错误
递归值嵌套:
struct Node {
int data;
struct Node next; /* 错误:无限递归 */
};
最佳实践
- 值嵌套用于组合关系(has-a)
- 引用嵌套用于链接关系、递归结构
- 自引用必须用指针
- 嵌套层次不宜过深(可读性)