
今天有关结构的一些问题,请在此处标记
结构的定义如下,struct是structure关键字,tag是结构的标志,member-list是结构成员列表,它必须列出其所有成员;为该结构变量声明了变量列表.
1 struct tag 2 { 3 member-list 4 } variable-list ;
通常,必须显示标签,成员列表和变量列表这三个部分中的至少两个. 这是一个示例:

1 //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c 2 //同时又声明了结构体变量s1 3 //这个结构体并没有标明其标签 4 struct { 5 int a; 6 char b; 7 double c; 8 } s1; 9 10 11 //此声明声明了拥有3个成员的结构体,分别为整型的a,字符型的b和双精度的c 12 //结构体的标签被命名为SIMPLE,没有声明变量 13 struct SIMPLE{ 14 int a; 15 char b; 16 double c; 17 }; 18 //用SIMPLE标签的结构体,另外声明了变量t1、t2、t3 19 struct SIMPLE t1, t2[20], *t3; 20 //也可以用typedef创建新类型 21 typedef struct{ 22 int a; 23 char b; 24 double c; 25 } Simple2; 26 //现在可以用Simple2作为类型声明新的结构体变量 27 Simple2 u1, u2[20], *u3;
在上面的声明中,即使编译器的成员列表相同,第一个和第二个声明也被编译器视为两个完全不同的类型. 设置t3 =&s1是非法的. 结构的成员可以包含其他结构,也可以包含指向其自身结构类型的指针. 通常,此类指针的应用是实现一些更高级的数据结构,例如链表和树.
如果两个结构相互包含,则需要对其中一个进行不完整的声明,如下所示:
//结构体A中包含指向结构体B的指针 struct A { struct B *partner; //other members; }; //结构体B中包含指向结构体A的指针,在A声明完后,B也随之进行声明 struct B { struct A *partner; //other members; };

1.1不使用typedef时
错误的方式:
1 struct tag_1 2 { 3 struct tag_1 A; /* 结构体 */ 4 int value; 5 };
该语句是错误的,因为该语句实际上是一个无限循环,成员b是结构,并且b内部将有成员作为结构,然后继续进行无线循环. 分配内存时,由于无限嵌套,无法确定此结构的长度,因此此方法是非法的.

正确的方法: (使用指针):
1 struct tag_1 2 { 3 struct tag_1 *A; /* 指针 */ 4 int value; 5 };
由于指针的长度是固定的(在32位计算机上,指针的长度为4),因此编译器可以确定结构的长度.
1.2使用typedef时

错误的方式:
1 typedef struct 2 { 3 int value; 4 NODE *link; /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */ 5 } NODE;
此处的目的是使用typedef为结构创建别名NODEP. 但这是错误的结构体,因为类型名称的范围从语句的末尾开始,并且由于尚未定义,因此不能在结构内部使用.
正确的方法: 共有三种方法结构体,相差不大,您都可以使用.
1 /* 方法一 */ 2 typedef struct tag_1{ 3 int value; 4 struct tag_1 *link; 5 } NODE; 6 7 8 /* 方法二 */ 9 struct tag_2; 10 typedef struct tag_2 NODE; 11 struct tag_2{ 12 int value; 13 NODE *link; 14 }; 15 16 17 /* 方法三 */ 18 struct tag_3{ 19 int value; 20 struct tag_3 *link; 21 }; 22 typedef struct tag_3 NODE;
错误的方式:
1 typedef struct tag_a{ 2 int value; 3 B *bp; /* 类型B还没有被定义 */ 4 } A; 5 6 typedef struct tag_b{ 7 int value; 8 A *ap; 9 } B;
错误原因与上面相同. 在这里使用B类型,然后再对其进行定义.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-162248-1.html
也行
有台人回到家乡这么说