c++ 结构体转为string_c-结构体学习

b812a34d987297c49f8b5611d93cc494.png

声明及使用

#include int main(){    struct Stu{        int age; // 4个字节        char projects[3]; // 3个字节        int score; // 4个字节    };    struct User{        char gender; // 1        short age; // 2        int number; // 4    };    printf("User size is %lu ", sizeof(struct User));    // User size is 8    struct Stu jack;    printf("jack size is %lu ", sizeof(jack));    // jack size is 12    return 0;}

结构体可以存放多种类型的不同数据,提供一种灵活的方式

内存对齐的问题

可以看到User的内存大小为8字节,而不是1+2+4= 7, 由于内存对齐的问题,这里以4个字节对齐

5bcd700c4910d6f91dfff2e429d5f074.png

内存对齐

我们看到Stu的总大小为12个字节,而不是4+3+4字节,这里跟上面的对齐原理是一致的

赋值取值

#include int main(){    struct Stu{        int age; // 4个字节        char projects[3]; // 3个字节        int score; // 4个字节    };    struct User{        char gender; // 1        short age; // 2        int number; // 4    };    printf("User size is %lu ", sizeof(struct User));    // User size is 8    struct Stu jack;    printf("jack size is %lu ", sizeof(jack));    // jack size is 12    jack.age = 1;    printf("jack age is %d ", jack.age);    // jack age is 1     return 0;}

成员的更新、获取都通过 . 操作进行

结构体的指针

 #include int main(){    struct Stu{        int age; // 4个字节        char projects[3]; // 3个字节        int score; // 4个字节    };    struct User{        char gender; // 1        short age; // 2        int number; // 4    };    printf("User size is %lu ", sizeof(struct User));    // User size is 8    struct Stu jack;    printf("jack size is %lu ", sizeof(jack));    // jack size is 12    jack.age = 1;    printf("jack age is %d ", jack.age);    // jack age is 1    struct User user;    user.age = 1;        // 结构体的指针    struct User *user_pointer;    user_pointer = &user;    printf("userpointer is %p ", user_pointer);    printf("user age is %d ", user_pointer->age);    return 0;}

当我们改变struct的成员顺序发现一个有趣的现象

struct User占用内存变为了12字节,之前是8字节,这是由于成员顺序变更导致内存对齐时的大小发生变化,char gender要对齐四个字节,short age 也要对齐四个字节,由于中间隔着int number 导致无法紧凑存放,因此总内存占用变为 4*3 = 12

#include int main(){    struct Stu{        int age; // 4个字节        char projects[3]; // 3个字节        int score; // 4个字节    };    struct User{        char gender; // 1        int number; // 4        short age; // 2    };    printf("User size is %lu ", sizeof(struct User));    // User size is 12    struct Stu jack;    printf("jack size is %lu ", sizeof(jack));    // jack size is 12    jack.age = 1;    printf("jack age is %d ", jack.age);    // jack age is 1    struct User user;    user.gender = 's';    user.age = 1;    user.number = 22;    // 结构体的指针    struct User *user_pointer;    user_pointer = &user;    printf("userpointer is %p ", user_pointer);    printf("user age is %d ", user_pointer->age);    return 0;}
55711f971f0e92183ca78401450696b2.png

成员顺序影响结构体大小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值