零零雨天飒风图书馆记下
先来看结构体的”结构“
struct 结构体类型名{
成员1;
成员2;
.....;
}结构体变量名;
系统不会为 struct 结构体类型 分配空间 而是为结构体变量分配空间
关于结构体变量命名
在main函数中
struct 结构体类型名 结构体变量名 如:struct Stu a={初始化复制};
或者在定义结构体类型的同时定义结构体变量 同样可以初始化
关于结构体变量的成员访问:
通过运算符 ”.“还有指针->
- 赋值
- 访问
- 该值
看一个简单例子:
#include<stdio.h>
struct Stu {
int id;
char name[10];
char sex[10];
} a = {1, "高远", "女"};
void print(struct Stu *p) {
//结构体指针变量->成员名
printf("%d,%s,%s\n", (*p).id, (*p).name, (*p).sex);
printf("%d,%s,%s\n", p->id, p->name, p->sex);
}
//直接传递结构体 会占用内存性能
void print2(struct Stu b) {
printf("%d,%s,%s\n", b.id, b.name, b.sex);
}
struct Peo {
struct Stu c;
int num;
};
int main() {
//struct 结构体类型名 结构体变量名(对象)
struct Stu b = {2, "哈哈", "男"};
//结构体对象.成员变量
printf("%d,%s,%s\n", a.id, a.name, a.sex);
printf("%d,%s,%s\n", b.id, b.name, b.sex);
print(&b);
print2(b);
//结构体嵌套
struct Peo gao = {{3, "低近", "女"}, 25};
//printf 函数不能直接打印一个结构体(如 gao.c)作为一个整体
printf("%d,%s,%s,%d", gao.c.id, gao.c.name, gao.c.sex, gao.num);
}
上面也讲述了关于结构体的嵌套和传参 尽量使用地址传参
重点来看关于结构体变量的存储 内存对齐
1.第一个成员在结构体变量偏移量为0的地址处
2.其他成员变量要对齐到对齐数的整数倍地址处
3.结构体总大小为最大对齐数的整数倍
4.结构体嵌套的结构体对齐到最大对齐数的整数倍处
对齐数=默认对齐数(编译器8)和该成员大小的较小值
很抽象 实际很简单 直接看例子
#include "stdio.h"
struct s3 {
double d;
char c;
int i;
};
struct s4 {
char c1;
struct s3 s3;
double d;
};
int main() {
printf("%d\n", sizeof(struct s3));
printf("%d\n", sizeof(struct s4));
}
分析
关于枚举和共用体
枚举类型 可以一一列举
enum sex {
man = 5,
woman = 6
};
enum data {
zero,//0
one //1
};
关于共用体union内存对齐
共用同一块空间
大小为最大成员大小 对齐最大对齐数的整数倍 看例子:
//联合体 共用体(共用同一块空间)
union aa {
int a; //4 / 8 对齐数4
char b[5]; // 5 1 /8 对齐数1
//最大成员大小5 最大对齐数4的整数倍 8
};
union bb {
int d1;
float d2;
} t;
int main() {
printf("%d\n", sizeof(union aa));
t.d1 = 99;
}
然后还有个 typedef 数据类型 别名
记录一些错题:
typedef long int BIG作用:
定义了一个新的数据类型标识符
声明结构体类型的同时 系统为其分配存储空间 X
在程序中不可使用和结构体类型中的成员名相同的变量名 X
共用体类型中不能使用结构体 X
共用体中的成员必须具有相同的类型 X
在一个共用体变量中 可以同时对多个成员赋值 X
结构体名在定义结构体时不可以省略 X
共用体变量初始化只能有一个常量
若修改了共用体变量中某个成员的值 则其他成员的值也会改变
//定义一个结构体变量包括年月日 计算当天在本年中是第几天 考虑闰年问题
#include "stdio.h"
struct time {
int year;
int month;
int day;
};
void print(struct time com) {
int ok[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int result = 0;
if (com.year % 4 == 0 && com.year % 100 != 0 || com.year % 400 == 0) {
ok[1] = 29;
}
for (int i = 0; i < com.month - 1; ++i) {
result += ok[i];
}
printf("最终结果为:%d", result + com.day);
}
int main() {
int a, b, c;
printf("输入今天的日期:");
scanf("%d %d %d", &a, &b, &c);
printf("年:%d 月:%d 日:%d\n", a, b, c);
struct time com = {a, b, c};
print(com);
}
//用结构体类型输出一年中十二个月的英文名称及相应天数
#include <stdio.h>
struct Month {
char name[20];
int days;
};
int main() {
struct Month months[] = {
{"January", 31},
{"February", 28},
{"March", 31},
{"April", 30},
{"May", 31},
{"June", 30},
{"July", 31},
{"August", 31},
{"September", 30},
{"October", 31},
{"November", 30},
{"December", 31}
};
for (int i = 0; i < 12; i++) {
printf("%s %d \n", months[i].name, months[i].days);
}
return 0;
}
标签:struct,55,31,阐论,int,printf,共用,对齐,结构
From: https://www.cnblogs.com/gaodiyuanjin/p/18405937