首页>百科 > 正文

结构体

2023-08-05 19:45:21    出处:博客园


(资料图片)

结构体

头文件

#include#include

声明结构体

//声明一个学生类型,是想过学生类型来创建学生变量//描述学生:属性-名字+电话+性别+年龄struct Stu{    char name[20];    char tele[12];    char sex[20];    int age;}s4,s5,s6;struct Stu s3;//全局变量int main(){    //创建的结构体变量    struct Stu s1;    struct Stu s2;        return 0;}

匿名结构体类型

struct{    int a;    char c;}sa;struct{    int a;    char c;}*psa;int main(){    psa=&sa;//非法的    return 0;}

结构体的自引用

struct Node{    int date;    struct Node* next;};int main(){    return 0;}typedef struct Node{    int date;//4    struct Node* next;//4/8}Node;int main(){    struct Node n1;    Node n2;    return 0;}

结构体的初始化

struct T{    double weight;    short age;};struct S{    char c;    struct T st;    int a;    double d;    char arr[20];};int main(){    struct S s = {"c",{55.6,30},100,3.14,"hello bit"};    printf("%c %lf %d %d %lf %s\n",s.c,s.st.weight,s.st.age,s.a,s.d,s.arr);        return 0;}

结构体内存对齐

struct S1{    char c1;    int a;    char c2;};struct S2{    char c1;    char c2;    int a;};struct S3{    double d;    char c;    int i;};struct S4{    char c1;    struct S3 s3;    double d;};int main(){    struct S1 s1 = {0};    printf("%d\n",sizeof(s1));    struct S2 s2 = {0};    printf("%d\n",sizeof(s2));    struct S3 s3 = {0};    printf("%d\n",sizeof(s3));    struct S4 s4 = {0};    printf("%d\n",sizeof(s4));    return 0;}#pragma pack(4)  //设置默认对齐数为4struct S{    char c1;    double d;};#pragma pack()  //取消默认对齐数int main(){    struct S s;    printf("%d\n",sizeof(s));    return 0;}

写一个宏,计算结构体中某变量相对于首地址的偏移 offsetof()宏的实现、

struct S{    char c;    int i;    double d;    };int main(){    //offsetof();    printf("%d\n",offsetof(struct S,c));    printf("%d\n",offsetof(struct S,i));    printf("%d\n",offsetof(struct S,d));    return 0;}

结构体传参

struct S{    int a;    char c;    double d;};void Init(struct S* ps){    ps->a = 100;    ps->c = "w";    ps->d = 3.14;}//传值Print1(struct S tmp){    printf("%d %c %lf\n",tmp.a,tmp.c,tmp.d);}//传址(推荐)Print2(const struct S* ps){    printf("%d %c %lf\n",ps->a,ps->c,ps->d);}int main(){    struct S s = {0};    Init(&s);    Print1(s);    Print2(&s);    /*s.a = 100;    s.c = "w";    s.d = 3.14;        printf("%d\n",s.a);*/    return 0;}

位段 - 二进制位 为了节省空间

struct S{    int a:2;    int b:5;    int c:10;    int d:30;    //后面数字不能大于32};//47bit - 6个字节*8 = 48bitint main(){    struct S s;    printf("%d\n",sizeof(s));//8个字节    return 0;}

位段的内存分配

struct S{    char a:3;    char b:4;    char c:5;    char d:4;};int main(){    struct S s={0};        s.a = 10;    s.b = 20;    s.c = 3;    s.d = 4;    return 0;}

关键词:

消费
产业
共青农场有限公司:揭榜挂帅显身手 攻坚克难勇“亮剑” 共青农场有限公司大力强化党组织建设的政治引领、方向引领、发展引领作
证券行业定向“降准” 将释放超三百亿资金 据新华社报导,结算备付金被称为证券行业的“存款准备金”。对于资本市
通胀恐重新抬头?华尔街密集警告:市场将出现麻烦 富国银行在一份报告中称,FOMO(错失恐惧症)推动的股市反弹可能不会持
第一届全国学生(青年)运动会交通保障工作推进会在邕召开 【来源:广西省交通局_图片新闻】南宁讯(唐梦琳通讯员李铭辉摄影报道
基金