结构体
在实际问题中,一组数据往往具有不同的数据类型。不能用数组来存储。所以出现了结构体,有若干成员组成(实型,整型,字符型),在说明和使用时都必须先构造他。
struct 结构名
{成员列表};
Eg:
struct stu
{int num;
char name;
char sex;
float score;
} stu1,stu2;
stu1和stu2为结构体变量。
stu[5]定义了一个结构数组.
Eg:
struct stu
{
int num;
char*name;
char sex;
float score;
}stu[5] = {
{ 101, "李品", 'M', 45 },
{ 102, "张平", 'M', 65 },
{ 103, "何帆", 'F', 82 },
{ 104, "陈琳", 'F', 68 },
{ 105, "王敏", 'F', 74 }
};
int main()
{
int i, c = 0;
float ave, s = 0;
for (i = 0; i < 5; i++)
{
s += stu[i].score; //计算五名同学的总分。
if (stu[i].score < 60)//不及格的人数
c += 1;
}printf("s=%f\n", s);
ave = s / 5;//平均分
printf("average=%f\n count=%d\n", ave, c);
return 0;
}
指向结构变量的指针
struct 结构体 结构指针变量
注意:(stu).num或者stu->num。(stu)两边的括号不能去掉,因为.的优先级高于*的优先级去掉变成 *(stu.num)。
struct stu
{
int num;
char*name;
char sex;
float score;
}stu1 = {101,"张明",'M',78.2},*pstu;
int main()
{
pstu = &stu1;
printf("Number=%d\n Name=%s\n", stu1.num, stu1.name);
printf("Sex=%c\n Score=%f\n", stu1.sex, stu1.score);
printf("Number=%d\n Name=%s\n", (*pstu).num, (*pstu).name);
printf("Sex=%c\n Score=%f\n", (*pstu).sex, (*pstu).score);
printf("Number=%d\n Nume=%s\n", pstu->num, pstu->name);
printf("Sex=%c\n Score=%f\n", pstu->sex, pstu->score);
return 0;
}
结构体的内存对齐
1.第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
(VS中默认的值为8 Linux中的默认值为4)
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所
有最大对齐数(含嵌套结构体的对齐数)的整数倍。
Eg:
struct S1
{
char c1;
int i;
char c2;
};
;
struct S2
{
char c1;
char c2;
int i;
};
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c1;
struct S3 s3;
double d;
};
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
printf("%d\n", sizeof(struct S3));
printf("%d\n", sizeof(struct S4));
return 0;
}
分析这四个结构体,打印他们所占的字节数。
以我们的思维可以看出s1,s2,s3,s4为6,6,13,22。
运行结果为: