C结构体的用法详解

来源:互联网 发布:js文件代码的执行顺序 编辑:程序博客网 时间:2024/05/17 22:07

1.

#include<stdio.h>struct Student//定义结构体{    char name[10];    int age;};int main(){    struct Student stu;//声明结构体变量    scanf("%s%d",stu.name,&stu.age);    printf("%s %d\n",stu.name,stu.age);    return 0;}

2.

#include<stdio.h>struct Student//定义结构体同时声明结构体变量{    char name[10];    int age;}stu1,stu2;int main(){    scanf("%s%d",stu1.name,&stu1.age);    printf("%s %d\n",stu1.name,stu1.age);    return 0;}

3.

#include<stdio.h>struct//定义结构体同时声明结构体变量,并省略了结构体类型名,此时不能再以此结构体类型去申明其他变量{    char name[10];    int age;}stu1,stu2;int main(){    scanf("%s%d",stu1.name,&stu1.age);    printf("%s %d\n",stu1.name,stu1.age);    return 0;}

4.使用typedef的情况

#include<stdio.h>typedef struct Student{    char name[10];    int age;}stu1,stu2;//给struct Student取了两个别名int main(){    stu1 stu;    scanf("%s%d",stu.name,&stu.age);    printf("%s %d\n",stu.name,stu.age);    return 0;}

5.

#include<stdio.h>typedef struct Student{    char name[10];    int age;}stu1,stu2[100];//给struct Student取了两个别名int main(){    stu2 stu;//声明了一个长度为100的结构体数组stu    scanf("%s%d",stu[1].name,&stu[1].age);    printf("%s %d\n",stu[1].name,stu[1].age);    return 0;}

6.解析严蔚敏《数据结构》Page163的代码

typedef struct ArcNode//ArcNode不能省略,因为还要声明struct ArcNode *nextarc;{    int adjvex;    struct ArcNode *nextarc;//使用struct ArcNode 声明变量的原因是struct ArcNode 还没取别名    InfoType *info;}ArcNode;typedef struct VNode{    VertexType data;    ArcNode *firstarc;}VNode,AdjList[MAX_VERTEX_NUM];typedef struct {    AdjList vertex;//vertex是长度为MAX_VERTEX_NUM的结构体数组    int vernum,arcnum;    int kind;}ALGraph;


7.关于结构体的自引用

 自引用 结构体

1.1 不使用typedef时

错误的方式:

[cpp] view plaincopy
  1. struct tag_1{  
  2.     struct tag_1 A;   /* 结构体 */  
  3.     int value;  
  4. };  

        这种声明是错误的,因为这种声明实际上是一个无限循环,成员b是一个结构体,b的内部还会有成员是结构体,依次下去,无线循环。在分配内存的时候,由于无限嵌套,也无法确定这个结构体的长度,所以这种方式是非法的。

正确的方式: (使用指针):

[cpp] view plaincopy
  1. struct tag_1{  
  2.     struct tag_1 *A;  /* 指针 */  
  3.     int value;  
  4. };  

        由于指针的长度是确定的(在32位机器上指针长度为4),所以编译器能够确定该结构体的长度。

1.2 使用typedef 时

错误的方式:

[cpp] view plaincopy
  1. typedef struct {  
  2.     int value;  
  3.     NODE *link;  /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */  
  4. } NODE;  

这里的目的是使用typedef为结构体创建一个别名NODEP。但是这里是错误的,因为类型名的作用域是从语句的结尾开始,而在结构体内部是不能使用的,因为还没定义。

正确的方式:有三种,差别不大,使用哪种都可以。

[cpp] view plaincopy
  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;  

0 0
原创粉丝点击