零零雨天飒风图书馆记下

先来看结构体的”结构“

struct 结构体类型名{
	成员1;
	成员2;
	.....;
}结构体变量名;
系统不会为 struct 结构体类型 分配空间 而是为结构体变量分配空间
关于结构体变量命名
	在main函数中
	struct 结构体类型名 结构体变量名 如:struct Stu a={初始化复制};
	或者在定义结构体类型的同时定义结构体变量 同样可以初始化

关于结构体变量的成员访问:
通过运算符 ”.“还有指针->

  1. 赋值
  2. 访问
  3. 该值
    看一个简单例子:
#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));
}

分析
image

image


关于枚举和共用体
枚举类型 可以一一列举
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;
}
posted on 2024-09-10 11:23  蒸饺  阅读(64)  评论(0)    收藏  举报