C语言复习7:结构体,内存对齐,共同体

## 结构体
        - 格式:
             struct 结构体名字{
                成员1;   //例如:char name[100];
                成员2;
                 …
               };


        - 起别名格式
      typedef struct 结构体名字{
                成员1;
                成员2;
                 …
             }别名;
     --> 有了别名后,结构体名字可以省略

        - 简单说明:结构体就是自定义的数据类型,由很多的数据组成的一个整体,每一个数据都是结构体的成员
        - 书写位置:函数里面-局部变量;函数外面-全局变量
        - 结构体作为函数参数(函数中可以传递结构体)
            1. 第一种情况:传递结构体中的数据值
            2. 第二种情况:传递结构体的地址值

       #include<stdio.h>
       #include<string.h>

        typedef struct message {
            char phone[12];
            char mail[100];
        }mess;

        //进行结构体嵌套
        struct people
        {
            char name[100];
            int age;
            struct message msg;
            //或写成 mess msg;
        };

        //进行取别名,其中student是可以省略的
        typedef struct student
        {
            char name[100];
            int age;
        }stu;

        void updatePeople(struct people * peo);

        int main() {
            struct people p1;  //进行批量赋值
            strcpy(p1.name,"张三");
            p1.age = 18;
            printf("姓名:%s\n年龄:%d\n\n",p1.name,p1.age);

            struct people p2 = {"王五",20};  //直接一次性赋值
            printf("姓名:%s\n年龄:%d\n\n", p2.name, p2.age);

            struct people p3;  //进行批量赋值
            strcpy(p3.name,"赵六");
            p3.age = 23;
            strcpy(p3.msg.phone,"18045461766");
            strcpy(p3.msg.phone, "zhaoliu@163.com");
            printf("姓名:%s\n年龄:%d\n电话号码:%s\n邮箱号:%s\n\n", p3.name, p3.age,p3.msg.phone,p3.msg.mail);

            struct people p4 = { "周八",21,{"15270741918","zhouba@qq.com"}};  //直接一次性赋值
            printf("姓名:%s\n年龄:%d\n电话号码:%s\n邮箱号:%s\n\n", p4.name, p4.age, p4.msg.phone, p4.msg.mail);

            struct people p[4] = {p1,p2,p3,p4}; //结构体数组
            for (int i = 0; i < 4; i++)
            {
                struct people temp = p[i];
                printf("姓名:%s---------年龄:%d\n", temp.name, temp.age);
            }

            //调用函数进行信息修改
            updatePeople(&p2);
            printf("王五修改后姓名:%s\n王五修改后年龄:%d\n\n", p2.name, p2.age);

            return 0;
        }

        void updatePeople(struct people* peo) {
            printf("请输入要修改王五的姓名为:");
            scanf("%s",(*peo).name);
            printf("请输入要修改王五的年龄为:");
            scanf("%d", &(*peo).age);
            printf("-->修改后姓名:%s\n-->修改后年龄:%d\n", (*peo).name, (*peo).age);
        }


## 内存对齐
        - 不管是结构体,还是普通变量都存在内存对齐
        - 规则:
            1. 只能放在自己类型的整数倍的内存地址上
            
        - 举例:
            2. int 存放的位置:内存地址一定能被4整除
            3. long long 存放的位置:内存地址一定能被8整除

        - 特殊说明:如果是结构体的内存对齐,那么结构体的总大小是最大类型的整数倍
        - 切记:对齐的时候会补空白字节,但是不会改变原来字节的大小,eg:char补位后,本身还是一个字节



## 共同体
        - 即,一种数据可能有多种类型
        - 特点:
           1. 又称共用体/联合体
           2. 所有的变量都使用同一个内存空间
           3. 所占的内存大小 = 最大成员的长度(也受内存对齐影响)
           4. 每次只能给一个变脸进行赋值,因为第二支赋值时会覆盖原有的值
        - 和结构体的区别:
           - 结构体:各存各的,内存占用时各个变量的总和(受内存对齐影响)
           - 共用体:存一起,多次会覆盖,内存占用是最大类型占用内存大小(也受内存对齐影响)





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值