结构体和联合体(课堂笔记)

//struct {
    //    char name[20];
    //    int no;
    //    float score;
    //}a, c;
    //int main()
    //{
    //    struct student b;//没有student不能用b
    //}

//struct student{
//    char name[20];
//    int no;
//    float score;
//}a = { "liming",10110,86.5 }, c;
//int main()
//{
//    struct student b;
//    //scanf("%s%d%f", b.name, &b.no, &b.score);//数组名不需要加&
//    //printf("%s %d %lf", b.name, b.no, b.score);
//    //c.name = "liming";//因为name是数组名,不能直接将字符串赋值给他
//    strcpy(c.name, "liming");
//    c.no = 10110;
//    c.score = 86.5;
//    printf("%s %d %lf", c.name, c.no, c.score);
//    printf("\n");
//    printf("%d", sizeof(struct student));
//}
//struct student {
//    int no;
//    char name[20];
//    float score;
//}c;
//int main()
//{
//    struct student b;
//    //scanf("%s%d%f", b.name, &b.no, &b.score);//数组名不需要加&
//    //printf("%s %d %lf", b.name, b.no, b.score);
//    //c.name = "liming";//因为name是数组名,不能直接将字符串赋值给他
//    strcpy(c.name, "liming");
//    c.no = 10110;
//    c.score = 86.5;
//    printf("%s %d %lf", c.name, c.no, c.score);
//    printf("\n");
//    printf("%d", sizeof(struct student));
//}

//结构体的内存对齐问题
//成员变量的对齐书等于编译器默认对齐数与成员变量大小的最小值
//第一个成员变量对齐到结构体变量起始位置偏移量为0的地址
//结构体大小为最大对齐数的整数位以下举例就是4的倍数
// (4)如果嵌套了结构体成员,嵌套的结构体成员数是其自身最大成员数的整数倍
//a占0-3位,因为char只占1个字节,123就空着,b从4开始,存放4567,c从8开始一直存到11,0-11加起来一共是4的倍数12;
//struct student {
//    char a;
//    int b;
//    char c;
//
//};
//int main() {
//    printf("%d", sizeof(struct student));
//}
//struct student {
//    char a;
//    char c;
//    int b;
//
//};
//int main() {
//    printf("%d", sizeof(struct student));//char a有一位,占0,1,1空着;char c有一位,占2,3,3空着,int有四位4567,没有空
//    //所占字节数按照有效字节数的倍数算,字节为4的时候,int4个字节就放满了,char a,char b不够放
//    //所以当为4的倍数8的时候,够存放三个类型
//}
//struct s1 {
//    char a;
//    int b;
//    char c;
//
//};
//struct s2 {
//    char a;
//    char c;
//    int b;
//
//};//8
//
//struct s3 {
//    double a;
//    char c;
//   int b;
//};//16
//struct s4 {
//    char a;
//    struct s3 b;//b从8开始到23
//    double c;
//};//32
//struct s5 {
//    char a;
//    struct s2 b;//b从8开始到23
//    double c;
//};
//
//int main() {
//    printf("%d\n", sizeof(struct s4));
//    printf("%d\n", sizeof(struct s5));
//}

//struct student {
//    char name[20];
//    int no;
//        float score;
//    }stu[3];
//    int main()
//    {
//        int i;
//        for (i = 0; i < 3; i++)
//        {
//            scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
//        }
//        for (i = 0; i < 3; i++)
//        {
//            printf("%s %d %f", stu[i].name,stu[i].no,stu[i].score);
//            printf("\n");
//        }
//
//    }

//结构体指针
//struct student {
//    char name[20];
//    int no;
//    float score;
//}stu[3];
//int main()
//{
//
//
//    int i;
//    for (i = 0; i < 3; i++)
//    {
//        scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
//    }
//    struct student* p = &stu;
//    for (i = 0; i < 3; i++)
//    {
//        printf("%s %d %f", (*p).name, (*p).no, (*p).score);
//        printf("\n");
//    }
//
//}
//struct student {
//    char name[20];
//    int no;
//    float score;
//}stu[3];
//int main()
//{
//
//
//    int i;
//    for (i = 0; i < 3; i++)
//    {
//        scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
//    }
//    struct student* p = &stu;
//    for (i = 0; i < 3; i++)
//    {
//        printf("%s %d %f", (*(p + i)).name, (*(p + i)).no, (*(p + i)).score);
//        printf("\n");
//    }
//    for (p=stu;p<stu+3;p++)
//    {
//        printf("%s %d %f", p->name, p->no, p->score);
//        printf("\n");
//    }
//    for (p = stu; p < stu + 3; p++)
//    {
//        printf("%s %d %f", (*p).name, (*p).no, (*p).score);
//        printf("\n");
//    }
//
//}

//struct student {
//    char name[20];
//    int no;
//    float score;
//}stu[3];
//void fun(struct student*p)
//{
//    if ((*p).score > ((*(p + 1)).score))
//    {
//        if ((*p).score > ((*(p + 2)).score))
//        {
//            printf("%s %d %f", (*p).name, (*p).no, (*p).score);
//        }
//        else if ((*p).score < ((*(p + 2)).score))
//        {
//            printf("%s %d %f", (*(p + 2)).name, (*(p + 2)).no, (*(p + 2)).score);
//        }
//    }
//    else if (((*(p + 1)).score)>(*p).score)
//    {
//        if ((*(p + 1)).score > ((*(p + 2)).score))
//        {
//            printf("%s %d %f", (*(p+1)).name, (*(p + 1)).no, (*(p + 1)).score);
//        }
//        else if ((*(p + 1)).score < ((*(p + 2)).score))
//        {
//            printf("%s %d %f", (*(p + 2)).name, (*(p + 2)).no, (*(p + 2)).score);
//        }
//    }
//}
//int main()
//{
//    struct student* p = &stu;
//    int i;
//    for (i = 0; i < 3; i++)
//    {
//        scanf("%s%d%f", stu[i].name, &stu[i].no, &stu[i].score);
//    }
//
//    fun(p);
//}

//共用体
//union a {
//    int a;
//    int b;
//    char c;
//}b = { 'a' };//对于联合体来说,在某一时间只能有一个变量给他赋值
//int main() {
//    union a c;
//    printf("%p\n",&c);
//    printf("%p\n", &c.a);
//    printf("%p\n", &c.b);
//    printf("%p\n", &c.c);
//    printf("%d\n", sizeof(c));//这个共用体内存空间是以他最大类型成员所占空间为主
//    printf("%c\n", b);//b='a'->a;b=23->23;
//    c.a = 12;
//    c.b = 65;
//    printf("%d\n", c.a);
//    printf("%d\n", c.b);
//    printf("%c\n", c.c);//以每次最后一个赋值为主
//
//
//}

//枚举类型
//enum a { monday, tuesday, wednesday, thursday=5, friday, saturday, sunday }b;//它的变量取值范围是有限的,枚举元素
//int main()
//{
//    printf("%d\n", wednesday);
//    b = friday;
//    printf("%d\n", b);//如果将Thursday改变成5,在他之前的数值不变,从他开始 以后都改变
//
//}
//int main()
//{
//    union {
//        int a, b;
//        struct {
//            int n,m,h;//与结构体内的变量顺序有关系,哪个在第一个,struct外的变量,就和那个占用一个地址
//        }k;
//        int a;
//    }e;
//    e.a = 1;
//    e.b = 2;
//    e.k.m = e.a * e.b;//2*2
//    e.k.n = e.a + e.b;//4+4
//    e.k.h = e.a - e.b;
//    
//    printf("%d,%d,%d", e.k.m, e.k.n,e.k.h,e.);
//}
int main()
{
    union {
        int a[3];
        long k;
        char c[4];

    }r,*s=&r;
    s->a[0] = 0x39;
    s->a[1] = 0x38;
    printf("%x\n", s->c[0]);//0x39先分配给a[0],0x38分配给a[1],  
                           //小端存储:将低字节数存放低地址处
                           //因为第一个元素int型有四个字节,将x39分配给
                            //第一行就是x39,剩下就自动分配0
    printf("%x\n", s->c[1]);
    printf("%x\n", s->c[2]);
    printf("%x\n", s->c[3]);
}

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C/C++编程中,结构体(struct)和联合体(union)都是用来组合不同类型的数据成员,但它们的用途和行为有所不同。 **结构体(Struct)**: - 结构体是一种用户自定义的数据类型,它可以包含不同类型和数量的数据成员。 - 每个结构体变量占有独立的内存空间,每个数据成员有自己的地址,即使它们的类型不同。 - 结构体通常用于表示具有多个相关属性或组件的实体,如一个人的信息(姓名、年龄、性别等)。 **联合体(Union)**: - 联合体同样可以包含不同类型的数据成员,但所有成员共享同一块内存空间,即只有一个成员在任何时候是有效的。 - 当一个联合体变量被初始化时,只有其中的一个数据成员会被占用,其他成员则会被清除为默认值。 - 联合体常用于存储大小不确定的数据,例如不同类型的测量值,因为它们只需要足够的空间来存储当前被选中的类型。 当结构体联合体结合使用时,可能会有这样的情况: 1. 结构体中包含了联合体作为其中一个成员,这样可以在更大的结构中嵌套更小的灵活性。 2. 有时联合体可以用作结构体的一个特殊成员,提供一种动态选择存储类型的能力。 3. 结构体联合体可以共同实现数据压缩或者简化内存管理。 **相关问题**: 1. 结构体联合体的主要区别是什么? 2. 联合体如何处理内存空间? 3. 结构体中嵌套联合体的例子是什么? 4. 在什么情况下会选择使用联合体而不是结构体

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值