c基础 结构体

结构体 struct

1.结构体基本用法

1.1 定义

结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。

使用结构体的好处:

结构体的使用为处理复杂的数据结构(链表)提供了有效的手段。

为函数间传递不同类型的数据提供了方便。

1.2结构体定义格式

struct 结构体

{

数据类型 成员变量名1;

数据类型 成员变量名2;

数据类型 成员变量名3;

...

};

举例

struct student
{
    char name[32];
    int age;
    float score;
};
定义了一个名字student结构体数据类型里面成员三个分别是name,agescore

1.3结构体变量 

1.3.1 概念

通过结构体类型定义变量

1.3.2 定义格式

struct 结构体 变量名;

1.3.3 定义结构体变量方式

先定义结构体,再定义结构体变量

struct 结构

{

成员变量;

};

struct 结构体 变量名;

例如

struct student s1;

定义结构体的同时定义结构体变量

struct 结构

{

成员变量;

};

1.3.4 结构体变量赋值

先定义一个结构体

struct student

{

char name[32];

int id;

int age;

};

定义结构体变量时直接使用花括号赋值

struct student s1 = {"xiaoming",1,18};

定义结构体用点等法赋值

struct student s2 =

{

.name ="xiaofang",

.id = 2,

.age =18

};

定义结构体变量时未初始化,需要单独给每个成员赋值。用成员访问符.

struct student s3;

s3.id=3;

s3.age=19;

strcpy(s3.name, "xiaowang");

1.3.5 访问结构体成员变量

通过.访问 结构体变量名.成员变量名

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
} s1, s2;     //定义结构体类型student的同时定义结构体变量s1和s2

int main()
{
    struct student s3 = {"xiaoliu", 1, 19};  //用struct student类型定义变量s3的同时给每个成员赋值
    struct student s4 = {
        .name = "xiaozhang",
        .id = 2,
        .age = 18};

    struct student s5;   //先定义结构体变量s5, 然后访问每个成员的方式赋值
    s5.id = 3;
    s5.age = 290;
    strcpy(s5.name, "yaojing");

    printf("%s %d %d\n", s3.name, s3.id, s3.age);
    printf("%s %d %d\n", s4.name, s4.id, s4.age);
    printf("%s %d %d\n", s5.name, s5.id, s5.age);
}

1.4重定义typedef

定义结构体的同时重定义

先定义结构体,然后重定义

2.结构体数组

2.1概念

结构体类型相同变量组成数组

2.2 定义格式

定义结构体的同时定义结构体数组

先定义结构体,然后定义结构体数组

struct student

{

int id;

int age;

};

struct student s[5];

2.3初始化

定义结构体数组同时赋值

struct student

{

int id;

int age;

};

struct student s[3] = {

{1, 19},

{2, 20},

{3, 18}};

2.4 结构体数组输入输出(for循环)

#include <stdio.h>
#include <string.h>

struct student
{
    char name[32];
    int id;
    int age;
};

int main()
{
    struct student s[3];

    for (int i = 0; i < 3; i++)
        scanf("%s %d %d", s[i].name, &s[i].id, &s[i].age);

    for (int i = 0; i < 3; i++)
        printf("%s %d %d\n", s[i].name, s[i].id, s[i].age);
}

3.结构体指针

3.1 概念

指向结构体变量指针

3.2定义格式

struct 结构体名 *结构体指针名

3.3 结构体指针所指变量的成员赋值

通过指向结构体变量的指针间接访问其中成员

格式 指针变量名 -> 成员变量名

p->id =1;

p->age =19;

strcpy(p->name,"li");

或者(*p).id=2; //不常用

3.4 大小

本质还是指针8字节32位系统4字节)

3.5 结构体结构体

如果成员变量本身属于另一种结构体类型,用若干个成员运算符一级级找到最低级的成员变量

4结构体大小以及对其原则

4.1 结构体大小可以用sizeof得出

sizeof(struct 结构体名);

或者

sizeof(结构体变量名);

结构体数组 结构体类型大小*元素个数

sizoef(数组名);

4.2 字节对齐原则

例如

struct stu

{

char a;

int c;

char b;

}; //sizeof(struct stu) 等于12

struct stu

{

char a;

char b;

int c;

}; //sizeof(struct stu) 等于8

第一个成员在相对于结构体变量起始位置偏移量offset为0的地址处(通俗点来说,就是第一个成员变量的地址与结构体起始位置的地址是相同的),以后每个成员按定义顺序依次存放在offset为该数据成员大小的整数倍的地方,只有double类型存放在4的整数倍的地方(比如int在32位机器位4字节,要从4的整数倍开始存储)。

用结构体里面最大的数据类型的大小和8(32位系统和4)进行比较,按照字节数小的为单位开辟空间。

4.3 节省空间原则

为了减少空间浪费,把占用空间小的成员集中到一起。

总体上来说,结构体的内存对齐就是一种用空间换取时间的做法,浪费空间来换取性能上的提升。那在设计结构体的时候,我们既要满足对齐,又要节省空间。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值