结构自参考

电脑杂谈  发布时间:2020-04-03 09:01:22  来源:网络整理

纸尿裤芯体结构_日报体结构_结构体

今天有关结构的一些问题,请在此处标记

结构的定义如下,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

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...