目录:
C结构体学习
- 学习目标:
- 结构体的概念及用途
- 结构体类型的声明及其字长
- 结构体变量的定义,访问和赋值
- 结构体数组和结构体指针的使用
注:本文为《21天学通C语言》第三版,刘蕾等编著学习笔记
初识结构体
声明结构体类型
-
格式:
struct 结构体名{ 数据类型1 结构体成员1: 数据类型2 结构体成员2: 数据类型3 结构体成员3: ... }
-
支持的数据类型
-
内置类型
- char
- short
- int
- float
- double
-
自定义类型
- struct结构体
- union联合体
- enum枚举类型
-
-
for example:
struct person_infor{ char name[SIZE_IN]; /*姓名*/ int age; /*年龄*/ char gender; /*性别*/ char profession[SIZE_IN]; /*职业*/ char address[SIZE_IN]; /*地址*/ char telephone[SIZE_IN]; /*电话*/ }
定义结构体变量
-
声明结构体类型,并定义结构体变量
struct persion_infor{ char name[SIZE_IN]; int age; char gender; ... } struct persion_infor Raul,Philip; struct persion_infor Joe;
-
不声明结构体类型,直接定义结构体变量
struct{ char name[SIZE_IN]; int age; char gender; ... } Raul,Philip,Joe;
-
使用typedef得到简化的结构体类型名,再定义结构体变量
typedef struct persion_infor{ char name[SIZE_IN]; int age; char gender; ... } infor; infor Raul,Phliip;
补充下 typedel用法:
typedef oldType new Type; typedef char myChar; myChar s="hello world"; typedel struct{} infor; // 原类型 新类型 infor student_infor; //声明变量
结构体的存储形式
- 结构体的本质
- 就是物理连续的线性数据结构
- 优化:
-
为了方便寻址,一般以其本身数据类型的字节长度为基本单位对齐。(类似mysql的char)
-
分配策略可以调整,通过使用#pragma pack 预处理命令来改变对齐规则(后面在了解下)
-
示例:
#include <stdio.h> /*使用typeof定义结构体类型*/ typedef struct _data_type_A{ char a[3]; /*成员a*/ int b; /*成员n*/ char c; /*成员c*/ } data_type_A; struct{ int a; /*成员a*/ double b; /*成员a*/ } v; /*定义结构体变量v*/ struct data_type_B{ char a[3]; /*成员a*/ char b; /*成员b*/ int c; /*成员c*/ }
- data_type_A
data_type_A该结构体有三个结构体成员,
第一个成员为char型数组占用3字节空间。结构体最低占用4个字节,所有空闲一个字节
第二个成员为int占用4字节空间,正好
第三个成员为char占用一个字节空间,空闲3个字节 - v
成员变量a和b 分别是int double,由于double型的对齐基本单位的字节数为sizeof(double)为8,因此该结构体的字节长度为16 - data_type_B
a成员为char型数组,占用3空间,第二成员为char占用一字节,第三成员为int占用4字节,字长为4字节,此时的空闲空间刚好是其对齐的的最小单位,即4字节的开始位置,因此,其得到的内存也紧挨着第二个成员
- data_type_A
-