复习c语言之进阶了解结构体的用法

#include<stdio.h>
//自定义类型:结构体,枚举,联合
//结构体变量
//struct Stu//struct是关键字  Stu是标签
//{
//    char name[20];
//    char tele[12];
//    char sex[10];
//    int age;
//}s3,s4,s5;//全局变量
//struct Stu s2;//全局变量
匿名结构体变量--省略tab
//struct
//{
//    char name[20];
//    int age;
//}x;
//struct
//{
//    char name[20];
//    int age;
//}*psa;
//结构体的自引用--在结构中包含一个类型为该结构本身的成员
//struct node
//{
//    int data;
//    struct node* next;//下一个的地址
//};
//重定义结构体
//typedef struct node
//{
//    int data;
//    struct node* next;
//}node;
//int main()
//{
//    struct Stu s1;//局部变量
//    //psa = &x;err,编译器会把上面的两个声明当成完全不同的两个类型,所以是非法
//    struct node s2;
//    node s3;
//    return 0;
//}
//结构体的初始化
//struct T
//{
//    double weight;
//    int age;
//};
//struct S
//{
//    char c;
//    struct T st;
//    int a;
//    double d;
//    char arr[20];
//};
//int main()
//{
//    //初始化
//    struct S s = { 'c',{55.3,30},100,3,14,"hello bit" };
//    printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
//    printf("%lf %d\n", s.st.weight, s.st.age);
//    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 st1;
//    double d;
//};
//结构体变量计算规则
//1.第一个成员在与结构体变量偏移量为0的地址处
//2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
//对齐数=编译器默认的一个对齐数与该成员大小的较小值
//VS中 默认的值为8,gcc无默认值 
//3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
//4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小计算所有最大对齐数(汉嵌套结构体的对齐数)整数倍
//int main()
//{
//    struct s1 st1 = { 0 };
//    struct s2 st2 = { 0 };
//    printf("%d %d %d %d\n",sizeof(st1), sizeof(st2),sizeof(struct s3),sizeof(struct s4));//12 8 16 32
//}
//修改默认对齐数
//设置默认对齐数为4
#pragma pack(4)
//struct s
//{
//    char c1;//1
//    double d;//8
//};
#pragma pack()
//取消设置的默认的对齐数
//int main()
//{
//    struct s str;
//    printf("%d\n", sizeof(str));//12
//    return 0;
//}
//宏-offsetof--计算结构体成员变量的偏移量
#include <stddef.h>
//struct s
//{
//    char c;
//    int i;
//    double d;
//};
//int main()
//{
//    struct s str;
//    printf("%d %d %d\n", offsetof(struct s, c),offsetof(struct s,i),offsetof(struct s,d));//0 4 8
//}
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
//struct stu
//{
//    char arr2[10];                                          
//    char c;
//    int arr1[5];
//};
//int main()
//{
//    struct stu s = { 0 };
//    printf("%d %d %d\n", offsetof(struct stu, arr2), offsetof(struct stu, c), offsetof(struct stu, arr1));//0 10 12
//    return 0;
//}
//结构体传参一要传结构体的地址,省空间
struct s
{
    int a;
    char b;
    double d;
};
//初始化函数
void Init(struct s* s1)
{
    s1->a = 100;
    s1->b = 'w';
    s1->d = 3.14;
}
//传值
void print1(struct s s1)
{
    printf("%d %c %lf\n", s1.a, s1.b, s1.d);
}
//传址,更加好点
void print2(struct s* s1)
{
    printf("%d %c %lf\n", s1->a, s1->b, s1->d);
}
int main()
{
    struct s s1 = { 0 };
    Init(&s1);
    print1(s1);
    print2(&s1);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值