中阶C语言基础:结构体

先上冷菜:复习结构体样式

type A:

多年工作经验告诉我这种方法最为标准实用,墙裂推荐

    typedef struct Student
    {
        int a;
    }Stu;

使用方法:

        Stu exam;

type B:

省略了struct后面的内容

    typedef struct
    {
        int a;
    }Stu;

使用方法:

        Stu exam;

type C:

省略了最后分号前的定义

    typedef struct stu
    {
        int a;
    };

使用方法:

        struct Student exam;

注意:这种方法编译器可能会警告,但是能够运行且正常读取数据不发生段错误。
图1

type D:不使用typedef的情况

typedef可以自定义化名称,不使用它相当于直接操作原生的结构体。
1.将typeA中的typedef去掉,此时Stu已经没意义了,注意不可以使用struct Stu exam

    struct Student
    {
        int a;
    }Stu;

使用方法:

struct Student exam;

2.将typeB中的typedef去掉
这是直接创建结构体变量的形式,只能使用一次,显然在实战中基本没有什么用处。

    struct
    {
        int a;
    }Stu;

3.将typeC中的typedef去掉
百度百科收录了这种写法,也是比较标准的,但是本人不推荐使用
    typedef struct stu
    {
    int a;
    };
使用方法:

struct Student exam;

冷菜总结:实际应用上使用TYPE A的场景极其繁多,真心只记住它就行。

热菜来了:

结构体指针

定义:
拿最经典的TYPE A,在分号前面增加了指针

    typedef struct Student
    {
        int a;
    }Stu,*pStu;

使用方法

pStu exam1;
Stu exam2;
exam1 = &exam2;//注意有些编译器可以不加&
exam2.a = 1;
printf("%d",exam1->a);//输出为1

也可以不改变TYPE A
使用方法

Stu *exam1;
Stu exam2;
exam1 = &exam2;//注意有些编译器可以不加&
exam2.a = 1;
printf("%d",exam1->a);//输出为1

复杂式结构体TYPE I:内有函数指针

继续拿最经典的TYPE A,加入函数指针

    typedef struct Student
    {
        int a;
        void (*fun)(int a);
    }Stu;

使用之前先定义一个引用的函数

void foo(int i){
    printf("%d",i);
}
    Stu exam;
    exam.fun = foo;
    exam.fun(1);//调用引用的函数,输出1

这个函数指针有点low,来个再复杂的,直接贴图
这里写图片描述

复杂式结构体TYPE II:内部竟有本身

就是这么神奇,继续拿最经典的TYPE A,加入本身

    typedef struct Student
    {
        int a;
           struct Student *stu_exam;
    }Stu;

用法:

Stu exam;
Stu child;
child.a = 1;
exam.stu_exam=child;//exam内的“本身”是结构体child

那么怎么读取child中的a元素值?

exam.stu_exam.a

显然不对,正确的做法是需要一个Stu类型的容器来装child,这是抽象的,实体实现就是定义一个Stu指针指向child

Stu *p;
p = exam.stu_exam;
printf("%d",p->a);//输出a,大功告成

未完待续

猜你喜欢

转载自blog.csdn.net/schumi2000/article/details/80548362