目录
一:什么是结构体
把不同的数据类型的数据结合在一起形成集合
结构体访问属性 使用点运算符
结构体定义,控制台输出数据,示例如下
#include<stdio.h>
//描述一个学生 学号 姓名 年龄 密码
struct student_t{
int sno; //学号 数据成员又名属性,用分号隔开
char name[20]; //姓名
char pwd[18]; //密码
int age; //年龄
}; //分号很重要,不能少
int main()
{
//结构体定义
struct student_t stu={1001,"lily","123456",18};
//结构体信息访问 用.点运算符 结构体名.属性名
printf("stu:hello,%d %s %d\n",stu.sno,stu.name,stu.age);//stu:hello,1001 lily 18
return 0;
}
只定义不初始化,结构体.属性都是随机值,不提倡这种定义方式:
struct student_t stu1;
二:结构体 逐个赋值属性
结构体定义后,属性 一个一个地进行赋值,[属性赋值] 示例如下:
#include<stdio.h>
#include<string.h>
//描述一个学生 学号 姓名 年龄 密码
struct student_t{
int sno; //学号
char name[20]; //姓名
char pwd[18]; //密码
int age; //年龄
};
int main()
{
//结构体定义
struct student_t stu1; //只定义没有初始化
stu1.sno=1002; //没有初始化只能一个一个赋值
strcpy(stu1.name,"kity");//字符数组赋值,strcpy引用头文件
stu1.age=20;
printf("stu1:hello,%d %s %d\n",stu1.sno,stu1.name,stu1.age);//stu1:hello,1002 kity 20
return 0;
}
三:结构体的定义
结构体定义大致分为三种:
定义并全部初始化,
只定义不初始化,
定义部分初始化
定义部分初始化,示例如下,没有赋值到的属性 默认是0或者是空字符串
#include<stdio.h>
#include<string.h>
//描述一个学生 学号 姓名 年龄 密码
struct student_t{
int sno; //学号
char name[20]; //姓名
char pwd[18]; //密码
int age; //年龄
};
int main()
{
//结构体定义
struct student_t stu2={1003}; //部分初始化 其他位置自动补零 字符串是空字符串
printf("stu2:hello,%d %s %d\n",stu2.sno,stu2.name,stu2.age);//stu2:hello,1003 (空字符串) 0
return 0;
}
结构体属性间存储的地址是连续的
四:结构体内存的占用
使用 sizeof()函数 用来计算字节长度
1.计算内存,以最大的存储类型【内存对齐】
示例一如下:
#include<stdio.h>
#include<string.h>
struct student_t{
int sno; //学号 4
char name[20]; //姓名 4*5
char pwd[18]; //密码 补充2个 4*5
int age; //年龄 4 共4+20+20+4=48
};
//计算内存 以最大的存储类型内存对齐
int main()
{
struct student_t stu={1001,"lily","123456",18};
printf("stu size=%d\n",sizeof(stu));//stu size=48
return 0;
}
示例二如下:
#include<stdio.h>
#include<string.h>
struct student_t{
int num1; //4
char ch; //1补3 为4
int num2; //4 总4+4+4=12
};
//计算内存 以最大的存储类型内存对齐
int main()
{
struct student_t stu={4,"lily",18};
printf("stu size=%d\n",sizeof(stu));//stu size=12
return 0;
}
2.相邻的同类型的可以合并,数据类型越小的一起往前面放可以节省空间
如下示例 数据类型小的 char数据类型 统一放置于前面 ,可以有效节省内存
#include<stdio.h>
#include<string.h>
struct student_t{
char num1; //1
char num2; //1 1 1合并为2 补6为8 最后是8
double num3; //8 总8+8=16
};
//相邻的同类型的可以合并的 数据类型越小的一起前面放可以节省空间
int main()
{
struct student_t stu={"kity","lily",18.123};
printf("stu size=%d\n",sizeof(stu));//stu size=16
return 0;
}
同样的数据类型,没有把较小的数据类型统一放置在前面,相对来说更浪费内存空间
#include<stdio.h>
#include<string.h>
struct student_t{
char num1; // 1 补7 为8
double num2; // 8
char num3; // 1 补7 为8 总8+8+8=24
};
//相邻的同类型的可以合并的 数据类型越小的一起前面放可以节省空间
int main()
{
struct student_t stu={"kity",18.123,"lily"};
printf("stu size=%d\n",sizeof(stu));//stu size=24
return 0;
}
3.结构体内存的计算练习
练习一:
#include<stdio.h>
#include<string.h>
struct student_t{
int NO[4]; // 4 向4看齐 4*4=16
char Name[20]; // 1 向4看齐 4*5=20 总16+20=36
};
int main()
{
struct student_t stu={18,"kity"};
printf("stu size=%d\n",sizeof(stu));//stu size=36
return 0;
}
练习二:
#include<stdio.h>
#include<string.h>
struct student_t{
int NO[4]; // 4 向8看齐 4*4=》16=》8*2 16
double str[4]; // 8 向8看齐 8*4=》 8*4 32 总16+32=48
};
int main()
{
struct student_t stu={18,18.123};
printf("stu size=%d\n",sizeof(stu));//stu size=48
return 0;
}