本帖最后由 sunsili 于 2023-10-14 12:42 编辑
C语言结构体基础知识总结和巩固
在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。
1. C语言结构体思维导图
2. 知识检验2.1 题1
以下对结构变量stu1中成员age的非法引用是 struct student
{
int age;
int num;
} stu1, *p;
p = &stu1;
A. stu1.age B. student.age C. p->age D. (*p).age 习题解析: 此题考察结构体成员变量引用相关的知识 在对结构体成员变量引用的方式中,有两种最为常见的方式,一种是箭头(->)方式的引用,另一种就是点(.)方式的引用。 两种引用方式的区别如下: 回到本题,stu1为结构体的变量,而p为指向结构体变量的指针。 选项A和C是最常用的一种引用方式, 选项D通过解引用结构体变量指针引用age成员, 这种做法是可以的。 而选项B是通过结构体类型名去引用age成员,这显然是错误的。 参考答案:B
2.2 题2以下程序输出的结果是什么? struct S1
{
char c1;
int i;
char c2;
};
int main(void)
{
printf("%lu\n", sizeof(struct S1));
return 0;
}
习题解析: 此题考察结构体类型占用的存储空间字节数。 结构体变量以及其中各成员变量在内存中以对齐的方式进行存储的。遵循如下对齐规则: 第一个成员在与结构体变量偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 结构体总大小为最大对齐数(成员变量都有一个对齐数)的整数倍。 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
回到本题。我们分析默认4个字节对齐的情况。 [td]成员 | 对齐数 | 偏移 | 占用字节的范围 | [size=1em]c1 |
| 0 | 0 ~ 0 | [size=1em]i | 4 | 4 | 4 ~ 7 | [size=1em]c2 | 1 | 8 | 8 ~ 8 |
参考答案:12
2.3 题3
以下程序的输出的结果是什么? struct S2
{
char c;
double d;
int i;
};
int main(void)
{
printf("%lu", sizeof(struct S2));
return 0;
}
习题解析: 此题考察结构体类型占用的存储空间字节数。 此题,我们依然分析默认4字节对齐的情况 根据题1中结构体遵循的对齐规则:
成员 | 对齐数 | 偏移 | 占用字节的范围 | c |
| 0 | 0 ~ 0 | d | 4 | 4 | 4 ~ 11 | c2 | 1 | 12 | 12 ~ 12 |
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍, 所以本题最终的结构体大小为16 参考答案:16
2.4 题4 为什么存在内存对齐?
参考答案:
2.5 题5
给定结构体 struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
问sizeof(A) = ? 习题解析: 此题考察结构体类型占用的存储空间字节数。 根据题1中结构体遵循的对齐规则:
成员 | 对齐数 | 偏移 | 占用字节的范围 | t:4, k:4 |
| 0 | 0 ~ 0 | i:8 | 2 | 2 | 2 ~ 3 | m | 4 | 4 | 4 ~ 11 (假设unsigned long为8个字节大小) |
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍, 所以本题最终的结构体大小为12 参考答案:12
|