自定义类型:结构体的内存对齐和传参问题

结构体基础知识:

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。可以分为结构体指针类型、结构体数组类型`
eg:
struct Stu
{
char name[20];
int age;
double height;
char sex;
}a[20],*P;
注意末尾分号不能丢。


结构体的成员可以是标量、数组、指针、甚至是其他结构体。
结构体变量的成员是通过点操作符(.)访问的,点操作符接受两个操作数。
eg:
Struct Stu
{
char name[20];
int age
};
Struct S s;
strcpy(s.name,"lisi");
s.age=20;//使用.age访问s的成员。


结构体内存对齐
1.第一个成员在与结构体变量偏移量为0的地址处;
2、其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
对齐数:编译器默认的对齐数与该成员大小的较小值
vs(8) ; li3nux(4)
3、结构体总大小为最大对齐数的整数倍(每个成员变量除了第一个成员都有一个对齐数)
4、如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的大小就是所有最大对齐数的整数倍。
结构体的内存对齐是拿空间来换取时间的做法。

eg

:`1)struct S1
    {
        char c1;//1
        int i;//3+4->8
        char c2;//1->9
    };//12
    printf("%d\n",sizeof(struct S1));//12
    2)struct S1
    {
        char c1;//1
        char c2;//1
        int i;//2+4
    };//8
    printf("%d\n",sizeof(struct S1));//8
    3)struct S1
    {
        double d;//8
        char c;//1
        int i;//3+4
    };//16
    printf("%d\n",sizeof(struct S1));//16
    4)
    struct S4
    {
    char c1;//1
    struct S1 s1;//7+16
    double d;//8
    };//32
    printf("%d\n",sizeof(struct  S4));//32

结构体传参:

#include<stdio.h>
#include<stdlib.h>
    struct S
    {
        int data[1000];
        int num;
    };
    struct S s={{1,2,3,4},1000};
    //结构体传参
    void print1(struct S s)
    {
    printf("%d\n",s.num);
    }//结构体地址传参
    void print2(struct S* ps)
    {
        printf("%d\n",ps->num);
    }
    int main()
    {
        print1(s);
        print2(&s);
        system("pause");
        return 0;
    }

结构体传参的时候,要传结构体的地址

你可能感兴趣的:(自定义类型:结构体的内存对齐和传参问题)