C结构体的用法详解

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时

错误的方式:

  1. struct tag_1{  
  2.     struct tag_1 A;   /* 结构体 */  
  3.     int value;  
  4. };  

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

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

  1. struct tag_1{  
  2.     struct tag_1 *A;  /* 指针 */  
  3.     int value;  
  4. };  

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

1.2 使用typedef 时

错误的方式:

  1. typedef struct {  
  2.     int value;  
  3.     NODE *link;  /* 虽然也使用指针,但这里的问题是:NODE尚未被定义 */  
  4. } 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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值