C语言数据类型第二篇------结构体struct (声明、定义、初始化、内存分配)

目录

 

一、结构体

二、结构体类型声明:

三、定义一个结构体变量:

四、访问结构体成员:

五、初始化方法:

方法1 <先声明再定义后初始化>

方法2 <定义的同时初始化>

         方法3<类型声明同时定义并初始化>

方法4 <定义的同时初始化、GNU特有>

 

六、定义结构体时的内存分配


一、结构体

这是我要讲解数据类型的第一个类型

而int、float那些简单的就省略了

 

结构体的应用很多

数据结构就是其中一个应用,例如我们熟知的链表

之所以使用结构体

很大程度上是方便程序猿管理多个变量,且可以是不同类型的变量

使得代码的可读性增强

例如我们用一个结构体描述一个学生的信息(名字、性别、学号)

struct student{
    char name[20];    //名字
    bool gender;    //性别
    char stuNum[10];    //学号

};

可见,结构体的方便之处!

 

 

二、结构体类型声明:

struct  结构体名称 {

    成员类型1  成员名1;
    成员类型2  成员名2;
    ...

 };

注意⚠️:这是数据类型的声明,不是变量的定义!

 

数据类型和变量一定要分清楚

并理解它们的意义

好了现在有了数据类型

我们尝试去定义一个变量吧

 

三、定义一个结构体变量:

struct  结构体名称  变量名;

<struct 结构体名称> 这里就是结构体数据类型

<变量名>这里就是结构体变量

 

四、访问结构体成员:

变量名.成员名

注意⚠️:假如这个结构体变量是一个结构体指针变量,则访问它的成员时用箭头  -> 

后续的篇章我们会讲解 结构体指针

 

五、初始化方法:

方法1 <先声明再定义后初始化>

//1.数据类型的声明
struct  Student {
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);//pfun是一个函数指针变量,它指向一个函数地址(函数名)
};

解析:

<pfun>是一个函数指针变量,<void (*)(int,int)>是它的数据类型

它指向一个函数地址(函数名)

后续会讲解 函数指针

 

//2.定义变量
struct Student stu;

 

//3.变量的初始化
strncpy(stu.name,"zhangsan",sizeof(stu.name));
stu.age = 20;
stu.gender = 1;
pfun = func; 

解析:

strncpystring家族中的strcpy的另一个版本

最后一个参数指的是 覆盖内容的大小(单位:字节)

 

方法2 <定义的同时初始化>

//1.数据类型的声明
struct  Student {
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);
};
//2.定义的同时初始化
struct  Student  stu = {"zhangsan",20,1,func};

方法3<类型声明同时定义并初始化>

//声明并定义一个变量
struct  Student {
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);
}stu;

或者(推荐)

//声明并定义一个变量同时初始化
struct  Student {
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);
}stu = {"zhangsan",20,1,func};

或者

//声明并定义一个变量同时初始化,但是这种方法很少用,建议不用,因为只能定义一次
struct{
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);
}stu = {"zhangsan",20,1,func};

 

方法4 <定义的同时初始化、GNU特有>

//1.数据类型的声明
struct  Student {
    char name[20];
    unsigned char age;
    unsigned char gender;
    void (*pfun)(int,int);
};
//2.定义同时初始化,GNU特有
struct  Student  stu = {
                .name = "zhangsan",
                .age = 20,
                .gender = 1,
                .pfun = test1
};

 

六、定义结构体时的内存分配

平时,我们定义了多少变量

似乎不太影响

但是当硬件资源不足时

就要开始对内存分配斤斤计较了

 

而且作为程序猿

站在内存上看代码

你定义了一个变量,内存是怎么分配给它的?

这不仅是一种思想

还是一个良好的编程习惯

 

我们来看一下这个结构体数据类型

请问它定义的变量在内存中占多少字节?

struct demo{
    int a; //4
    char b;  //1
    unsigned c; //1
    int d; //4
};

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

答案是12字节

原因在于C语言对struct中成员的内存分布

不管内部成员是什么数据类型都以4字节为单位来申请

每申请的4字节还剩下的能用继续用

不够用时再次申请4字节

并在新的4字节里重新开始分配

当分配到d时,只剩下2字节了,显然不够用

所以再重新申请4字节,并在新的字节上开始分配

可知,这样定义浪费了2字节空间大小的内存

 

所以,要站在内存上看代码

养成好的习惯

将来对自己的代码优化或改进提供一种方法

 

 

 

 

 

整理不易

点赞收藏关注喔~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖零猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值