谷动谷力
标题: C语言结构体基础知识总结和巩固 [打印本页]
作者: sunsili 时间: 2023-10-14 12:40
标题: C语言结构体基础知识总结和巩固
本帖最后由 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
欢迎光临 谷动谷力 (http://bbs.sunsili.com/) |
Powered by Discuz! X3.2 |