文章目录

  • 结构体类型的定义
  • 结构体变量的定义
  • 结构体变量成员的引用和赋值
  • 结构体变量的初始化
  • 结构体内存对齐
  • 指向结构体变量的指针
  • 指向结构体数组的指针
  • 结构体传参

结构体类型的定义

  • 结构是一些值的集合,这些值被称为成员变量,结构的每个成员可以是不同类型的变量
  • 结构体是一种复杂的数据类型,是数目固定,类型不同(也可以相同)的若干有序变量的集合
  • 结构体类型只能表示一个结构体形式,编译系统并不对其分配内存空间
  • 只有当某变量被说明为这种类型的结构体时,才对该变量分配存储空间
  • 结构体其所占的字节数是所占字节数之和
struct 结构体名
{//类型说明符 成员名;叫做成员变量
成员列表
};//分号不能丢

结构体变量的定义

方法一:先结构体类型的定义,后结构体变量的说明
struct stu
{int num;
char name[20];
char sex;
int age;
float score;
char addr[30]
};
struct stu boy1,boy2;//结构体变量,是个全局变量
方法二:定义结构体类型的同时说明结构体变量
struct stu
{int num;char name[20];char sex;int age;float score;char addr[30]
}boy1,boy2;
方法三:匿名结构体:直接说明结构体变量,只能定义变量一次
struct //省略结构体名
{int num;char name[20];char sex;int age;float score;char addr[30]
}boy1,boy2;

结构体变量成员的引用和赋值

"."称为结构体成员运算符

//引用:引用结构体变量时,往往不把它当作一个整体来引用,一般都是通过结构体变量的成员来实现赋值输入,输出等
结构体变量名.成员名
//例如:boy1.name
//赋值
boy1.name="zhang san"

结构体变量的初始化

struct stu
{int num;char name[20];char sex;int age;
};
int main()
{struct stu s={12,"nuhai",'man',17,}//结构体的初始化printf("%d %s %c %d",stu.num,stu.name,stu.sex,stu.age)return 0;
}

嵌套式的结构体

struct date//结构体类型
{int month;int day;int year;
};
struct stu
{int num;char name[20];char sex;struct date birthday;//成员又是一个结构体float score;
}boy1,boy2;

结构体内存对齐

总体来说:浪费空间,因为要拿空间换时间的做法
所以设计的时候:尽量让占用空间小的成员集中在一起
还有一种方法:修改默认对齐数,

//设置默认对齐数,例如:double本来是8,但和4比,取较小值4
#pragma pack(4)
结构体
//取消设置的默认对齐数
#pragma pack(4)

结构体的对齐规则:

  • 第一个成员在于结构体变量偏移量为0的地址处
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
  • 对其数=编译器默认的一个对其数于该成员大小的较小值,存于对其数的倍数内存上,例如:4/8,取4
  • 当结构体是嵌套结构体时,结构体的整数体大小就是所有嵌套结构体内部最大对齐数(含嵌套结构体的对齐数)的整数倍,然后再加上嵌套结构体的内存
  • 结构体总大小为最大对齐数的整数倍
  • gcc没有对齐数,成员大小就是对 齐数
  • char 为1,int 为4, double为8
struct s1
{char name;int num;char sex;
};
struct s2
{char name;char sex;int num;
};
int main()
{struct s1 s={0};printf("%d",sizeof(s));//12   1空三加4加1,然后取最大对齐数的整数倍struct s2 b={0};printf("%d",sizeof(b));return 0;
{

指向结构体变量的指针

当一个指针变量用来指向一个结构体变量时,称为指向结构体的指针变量

  • 结构体指针变量中的值时所指向的结构体变量的首地址
  • 赋值是把结构体变量的首地址赋值给指针变量,不是赋结构体类型
  • “->” 称为指向结构体成员的运算符
//结构体指针变量说明的一般形式:struct 结构体名 *结构体指针变量名;
//例如,前面定义了stu结构体,如果要说明一个指向stu的指针变量pstustruct stu *pstu;
//访问结构体变量成员形式:(*结构体指针变量).成员名
//例如:(*pstu).name
//或者写为:结构体指针变量->成员名
//例如:pstu->name

指向结构体数组的指针

  • 让指针变量指向一个结构体数组时,这时,结构体指针变量的值时整个结构体数组的首地址,
  • 或者当结构体指针变量指向结构体数组的某一个元素时,这时,指针变量的值时结构体数组中该元素的首地址
  • 注意,不永许取一个成员的地址来赋予它,只能赋予数组的首地址或者第几号元素的首地址
struct stu
{int num;char *name;char sex;float score;
}boy[5]={{01,"zhansan",'nan',12},{02,"lisi",'nan',13},{03,"wangwu",'nan',14},{04,"maliu",'nan',16},{05,"jinqi",'nan',19},
};
mian()
{//指向结构体数组的指针变量ps,ps是第0号元素,ps+1是第一号元素,ps+i是第i号元素struct stu *ps;for(ps=boy;ps<boy+5;ps++)printf("%d\t%s\t%c\t%f\t\n",ps->num,ps->name,ps->sex,ps->score);//指针变量输出结构体数组的内容
}
//ps=boy;//赋予数组的首地址
//ps=&boy[0];//赋予第0号元素的首地址
//ps=&boy[1].sex;但不允许赋予元素内成员的地址

结构体传参

结构体传参,首选传结构体的地址

  • 函数传参是需要压栈,会有时间和空间上的系统开销
  • 如果传递一个结构体对象的 时候,结构体过大,参数呀栈的系统开销比较大,所以导致性能的下降
struct S {//传值
void print1(struct S tmp)
{printf("%d %c %if\n",tmp.a,tmp.c,tmp.d)
//传址
void print1(struct S*tmp)
{printf("%d %c %if\n",tmp->a,tmp->c,tmp->d);
}
int main()
{struct S s={0};print1(s);//传值print2(&s);//传址
}

花神博客生涯之C语言(结构体上篇)结束了哦~
接下来会持续更新(⊙o⊙)!

C语言结构体与共用体(上篇) CSDN 花神生涯相关推荐

  1. C语言之结构体和共用体

    C语言之结构体和共用体 算上这篇笔记加上之前的四篇笔记,C语言基础我们也就告一段落了,对于刚刚接触c语言的童鞋们来说,这些以及足够了,稍后我会发布数据结构,对于想要深入学习的童鞋可以继续关注.本人也算 ...

  2. 【C语言】结构体、共用体、位域

    结构体 1. 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. }; 这是其中一种声明方式~ 2.定义一个结构体变 ...

  3. C语言入门系列之10.结构体和共用体

    文章目录 一.结构体变量的基本使用 1.概述 2.定义结构体类型变量的方法 3.结构体变量的引用 4.结构体变量的初始化 二.结构体的高级应用 1.结构体数组 Ⅰ定义结构体数组 Ⅱ结构体数组的初始化 ...

  4. C语言结构体与共用体03

    小甲鱼结构体与共用体03 实战例题:有一个结构体变量stu,内含学生学号.姓名和3门课程的成绩.通过调用函数print将它们输出. ①先用结构体变量作函数参数: //先用结构体变量作函数参数 #inc ...

  5. C语言-结构体与共用体

    int 4字节:char 1字节:short 2字节:float 4字节: 1字节bytes=8位bits(2^8): struct date {int month;int day;int year; ...

  6. 江哥带你玩转C语言 | 14 - 结构体-枚举-共用体

    什么是结构体 结构体和数组一样属于构造类型 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为 ...

  7. 结构体与共用体05 - 零基础入门学习C语言57

    第十章:结构体与共用体05 让编程改变世界 Change the world by program 对链表结点的删除操作实现 实现源代码: [codesyntax lang="c" ...

  8. 结构体与共用体07 - 零基础入门学习C语言59

    第十章:结构体与共用体07 让编程改变世界 Change the world by program 用typedef定义类型 用typedef声明新的类型名来代替已有的类型名   声明INTEGER为 ...

  9. 结构体与共用体C语言

    结构体与共用体 结构体的定义 引例 比如学生是一个整体,学生有姓名.性别.学号--我们更希望把一个事物整体的操作 自定义数据类型 基础数据类型是电脑定义好了的,默认的数据类型 自定义数据类型意义:需要 ...

最新文章

  1. 《JavaScript设计模式与开发实践》读书笔记之观察者模式
  2. golang中的big.Int
  3. linux下安装uuid库
  4. export TERM=xterm导致终端reset命令失效
  5. HTML label标签学习笔记
  6. 关于aop:pointcut的expression配制说明及JoinPoint
  7. leetcode 实现 strStr()
  8. PostGIS mysql_fdw安装(Linux)
  9. STM32 IWDG时间计算方法
  10. LINUX下载编译libx264
  11. webpack的详细使用
  12. 小菜找实习——阿里3月27日场笔试第一题
  13. python调用通达信函数_如何把通达信公式变成python
  14. Java笔记(1)黑马刘意_Java入门_2019_idea版
  15. android客户端服务器传输,【图片】【转】通过Android 客户端上传数据到服务器【aide吧】_百度贴吧...
  16. html5快捷键保存,保存的快捷键是什么?有了快捷键保存太方便了
  17. 【维修】【硬件】【苹果】wifi芯片被加密
  18. OAS ( Open Adoption Software ) 类公司的崛起
  19. Perfmon - Windows 自带系统监测工具
  20. 和自然语言处理有关的英语_自然语言处理对非英语语言的重要性

热门文章

  1. 蒲公英 · JELLY技术周刊 Vol.10 为什么你还不使用 TypeScript
  2. tensorflow自编码器+softmax对凯斯西储大学轴承数据进行故障分类
  3. intouch 连接mysql_Intouch访问SQL Access数据库实现.pdf
  4. 象素与数码摄影(摘录)
  5. 用Python编写成绩管理分析系统(故事升级版)
  6. csp 2021-04-05 疫苗运输
  7. AS 配置使用NDK
  8. 使用GemBox.Spreadsheet控件操作Excel文件
  9. PHP Mac composer 安装 valet
  10. 基于多目标遗传算法的IEEE14节点系统分布式电源选址定容matlab程序