十七、 结构体
17.1 定义及初始化
- 结构体内部,无具体数据,不分配内存
不能进行赋值。
#include<stdio.h>
typedef unsigned long long unit64;
struct Birthday
{
int year;
int month;
int day;
};
struct Student
{
char name[20];
int age;
struct Birthday bir;
};
int main()
{
struct Student stu1 = { "liubei",20 };
stu1.age = 38;
Student stu2 = { "caocao",18 };
unit64 a = 100;
return 0;
}
17.2 定义普通变量
#include<stdio.h>
struct
{
int a;
}C;
struct A
{
int a;
int b;
};
typedef struct B
{
int a;
int b;
}B;
int main()
{
A sa, sb;
sa.a = 10;
sa.b = 20;
sb = sa;
sb.a = sa.a;
B sc;
sc.a = sa.a;
return 0;
}
17.3 结构体指针变量
#include<stdio.h>
void Show(Student stu)
{
printf("%s,%d\n", stu.name, stu.age);
}
void Show_1(Student* pstu)
{
printf("%s,%d\n", (*pstu).name, (*pstu).age);
printf("%s,%d\n", pstu->name, pstu->age);
}
int main()
{
Show(stu1);
Show_1(&stu1);
return 0;
}
#include<stdio.h>
typedef struct A
{
int a;
int* b;
}A;
struct B
{
A sa;
A* sp;
int c;
struct B* sd;
};
int main()
{
B n;
B* bp = &n;
n.sa.a;
n.sa.b;
n.sp->a;
n.sp->b;
n.c;
n.sd->c;
n.sd->sd;
bp->sa.a;
bp->sa.b;
bp->sp->a;
bp->sp->b;
bp->c;
bp->sd;
return 0;
}
17.4 结构体数组
#include<stdio.h>
typedef struct Student
{
char name[20];
int age;
}Student;
void Show(Student *p,int len)
{
for (int i = 0; i < len; i++)
{
printf("%s,%d\n", p[i].name, p[i].age);
}
}
int main()
{
Student stu1 = { "liubei",20 };
Student arr[3] = { {"liubei",20},{"caocao",30},{"sunquan",18} };
Show(arr, sizeof(arr) / sizeof(arr[0]));
return 0;
}
17.5 结构体大小
- 内存对齐:
结构体成员要放在能够被自身大小整除的地址号上。
char类型1个字节,任何地址;
int整型4个字节,4的倍数。
结构体大小需能够整除最大成员所占字节数
#include<stdio.h>
struct A
{
char a;
int b;
};
struct B
{
char a;
short b;
int c;
};
struct C
{
char a;
int b;
int c;
double d;
};
struct D
{
int c;
char a;
};
struct E
{
char a;
int b;
short c;
};
struct F
{
char a;
struct GG
{
char b;
int c;
}g;
int d;
};
struct H
{
char a;
double d;
int c;
};
struct I
{
char a;
int B[2];
};
struct J
{
char a;
struct KK
{
char b;
int c;
};
short d;
};
struct L
{
char a;
struct
{
int b;
short c;
};
int d;
};
int main()
{
printf("%d\n", sizeof(D));
return 0;
}
struct B
{
char a;
char x;
short b;
int c;
};
#pragma pack(2)
#pragma pack()
17.6 结构体成员地址偏移量
int main()
{
struct G
{
char a;
short b;
int c;
float d;
double e;
long long f;
}G;
printf("%d\n", sizeof(G));
int dist = ((char*)&(G.d)) - ((char*)&G);
printf("%d\n", dist);
int dist = (int)&(((struct G*)0)->d);
printf("%d\n", dist);
#define OFFSET(type, arg) (int)&(((type*)0)->arg)
printf("%d\n", OFFSET(struct G,d));
return 0;
}