谷动谷力

标题: C语言结构体基础知识总结和巩固 [打印本页]

作者: sunsili    时间: 2023-10-14 12:40
标题: C语言结构体基础知识总结和巩固
本帖最后由 sunsili 于 2023-10-14 12:42 编辑

C语言结构体基础知识总结和巩固




在实际应用中,我们通常需要由不同类型的数据来构成一个整体,比如学生这个整体可以由姓名、年龄、身高等数据构成,这些数据都具有不同的类型,姓名可以是字符串类型,年龄可以是整型,身高可以是浮点型。为此,C语言专门提供了一种构造类型来解决上述问题,这就是结构体,它允许内部的元素是不同类型的。

1. C语言结构体思维导图
版权声明:此思维导图转自华为云社区用户CharlesE的文章,文章链接:https://bbs.huaweicloud.com/blogs/243521

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;
}

习题解析:
此题考察结构体类型占用的存储空间字节数。
结构体变量以及其中各成员变量在内存中以对齐的方式进行存储的。遵循如下对齐规则:
回到本题。我们分析默认4个字节对齐的情况。
[td]
成员
对齐数
偏移
占用字节的范围
[size=1em]c1
00 ~ 0
[size=1em]i444 ~ 7
[size=1em]c2188 ~ 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
00 ~ 0
d444 ~ 11
c211212 ~ 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
00 ~ 0
i:8222 ~ 3
m444 ~ 11 (假设unsigned long为8个字节大小)
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍, 所以本题最终的结构体大小为12
参考答案:12






欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2