[c语言日寄]结构体的使用及其拓展

【作者主页】siy2333

【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!

【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法

【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study


文章目录


前言

在C语言的世界里,结构体(struct)是一种非常强大且灵活的工具,它允许我们自定义数据类型,将多个不同类型的数据组合在一起。这种特性使得结构体在处理复杂数据时变得非常方便。今天,我们就通过一个简单的程序来深入探讨结构体的使用,以及它在C语言中的重要性。

题目引入

下面程序的输出结果是:( )

c 复制代码
struct stu
{
    int num;
    char name[10];
    int age;
};

void fun(struct stu *p)
{
	printf("%s\n",(*p).name);
	return;
}

int main()
{
	struct stu students[3] = {{9801,"zhang",20},
							 {9802,"wang",19},
                    {9803,"zhao",18} };
   fun(students + 1);
	return 0;
}

A.zhang

B.zhao

C.wang

D.18

在接下来的文章中,我们会一起把结构体的知识与题目结合起来,学习这一知识点。

一、结构体的定义与初始化

结构体的定义

结构体的定义通常使用struct 关键字,后面跟着结构体名称 和花括号{}括起来的成员列表

c 复制代码
struct stu
{
    int num;
    char name[10];
    int age;
};

这里,我们定义了一个名为struct stu的结构体,它包含三个成员:

  • int num:表示学生的编号。
  • char name[10]:表示学生的姓名,是一个长度为10的字符数组。
  • int age:表示学生的年龄。

结构体的定义只是定义了一个数据类型,就像定义了一个模板。要使用这个结构体,我们需要创建结构体变量。创建变量的方式与基本数据类型相同:

c 复制代码
struct stu a;//创建结构体变量

结构体变量的初始化

1. 直接初始化

在定义结构体变量时,可以直接为每个成员赋值:

c 复制代码
struct stu student = {1001, "Alice", 20};

这里,student是一个struct stu类型的变量,它的num成员被初始化为1001,name成员被初始化为"Alice",age成员被初始化为20。

2. 使用点运算符(.)逐个赋值

我们也可以在定义结构体变量后,使用点运算符逐个为成员赋值:

c 复制代码
struct stu student;
student.num = 1002;
strcpy(student.name, "Bob");//使用了strcpy函数来为name成员赋值,name是一个字符数组,不能直接用赋值运算符=来赋值。
student.age = 21;

3. 使用指针访问结构体成员

除了直接使用结构体变量,我们还可以通过指针来访问结构体成员。

c 复制代码
struct stu *p = &student;
printf("Name: %s, Age: %d\n", p->name, p->age);

这里,p是一个指向struct stu的指针,我们使用->运算符来访问结构体成员。

二、结构体数组的使用

结构体不仅可以单独使用,还可以作为数组的元素。结构体数组允许我们存储多个结构体变量,这在处理大量相关数据时非常方便。

c 复制代码
//例如,我们可以在一个数组中存储多个学生的信息:
struct stu students[3] = {
    {9801, "zhang", 20},
    {9802, "wang", 19},
    {9803, "zhao", 18}
};

在这里,students是一个包含3个struct stu元素的数组。每个元素都是一个结构体变量。

遍历结构体数组

我们可以使用循环来遍历结构体数组,并访问每个元素的成员:

c 复制代码
for (int i = 0; i < 3; i++) {
    printf("Student %d: Num = %d, Name = %s, Age = %d\n", i + 1, students[i].num, students[i].name, students[i].age);
}

这段代码会输出每个学生的编号、姓名和年龄。

使用指针访问结构体数组

与上文中使用指针为结构体变量初始化原理相同,我们也可以使用指针来访问结构体数组的元素:

c 复制代码
struct stu *p = students;
for (int i = 0; i < 3; i++) {
    printf("Student %d: Num = %d, Name = %s, Age = %d\n", i + 1, p->num, p->name, p->age);
    p++;
}

这里,p是一个指向struct stu的指针,初始时指向students数组的第一个元素。通过p++操作,我们可以逐个访问数组中的每个元素。

三、函数与结构体

在C语言中,函数是程序的基本组成单元,它允许我们将代码模块化,提高代码的可读性和可维护性。结构体与函数的结合使用可以实现更复杂的功能。

函数参数传递

函数可以接收结构体变量作为参数。当我们传递结构体变量时,可以选择传递值或传递指针。

  • 传递值时,函数会接收结构体的一个副本,对副本的修改不会影响原始变量。
  • 传递指针时,函数会接收结构体的地址,可以直接修改原始变量。

我们定义了一个函数fun,它接收一个指向struct stu的指针作为参数:

c 复制代码
void fun(struct stu *p)
{
    printf("%s\n", (*p).name);
    return;
}

这个函数的作用是打印传入的结构体变量的name成员。我们可以通过传递结构体数组的某个元素的地址来调用这个函数:

c 复制代码
struct stu
{
    int num;
    char name[10];
    int age;
};

void fun(struct stu *p)
{
	printf("%s\n",(*p).name);
	return;
}

int main()
{
	struct stu students[3] = {{9801,"zhang",20},
							 {9802,"wang",19},
                    {9803,"zhao",18} };
   fun(students + 1);//函数调用
	return 0;
}

这里,students + 1表示数组中第二个元素的地址(即&students[1])。因此,fun(students + 1)会打印出students[1]的name成员,即"wang"。

返回结构体变量

函数不仅可以接收结构体变量作为参数,还可以返回结构体变量。例如,我们可以编写一个函数来创建一个新的学生记录:

c 复制代码
struct stu create_student(int num, const char *name, int age)
{
    struct stu student;
    student.num = num;
    strcpy(student.name, name);
    student.age = age;
    return student;
}

这个函数接收学生的编号、姓名和年龄作为参数,创建一个新的struct stu变量,并将其返回。

四、程序分析与输出结果

现在,让我们回到最初的问题。我们有一个程序,它的代码如下:

c 复制代码
struct stu
{
    int num;
    char name[10];
    int age;
};

void fun(struct stu *p)
{
    printf("%s\n", (*p).name);
    return;
}

int main()
{
    struct stu students[3] = {
        {9801, "zhang", 20},
        {9802, "wang", 19},
        {9803, "zhao", 18}
    };
    fun(students + 1);
    return 0;
}

我们需要确定程序的输出结果。根据前面的分析,我们知道:

  • students是一个包含3个元素的struct stu数组。
  • students + 1表示数组中第二个元素的地址(即&students[1])。
  • fun(students + 1)会打印出students[1]的name成员。

故,程序的输出结果是"wang"。 所以,正确答案是: C. wang

五、结构体的高级特性

结构体在C语言中不仅仅是一个简单的数据组合工具,它还支持一些高级特性,这些特性使得结构体在复杂的应用场景中更加灵活和强大。

结构体嵌套

结构体可以嵌套,即一个结构体可以包含另一个结构体作为成员。例如,我们可以定义一个学生信息结构体,它包含一个地址信息结构体:

c 复制代码
struct address
{
    char street[50];
    char city[30];
    char state[20];
    int zip;
};

struct stu
{
    int num;
    char name[10];
    int age;
    struct address addr;
};

这里,struct stu包含了一个struct address类型的成员addr。

我们可以通过点运算符访问嵌套结构体的成员:

c 复制代码
struct stu student = {1001, "Alice", 20, {"123 Main St", "Springfield", "IL", 62704}};

printf("Student Name: %s, Address: %s, %s, %s, %d\n", student.name, student.addr.street, student.addr.city, student.addr.state, student.addr.zip);

结构体与联合体

联合体(union)是一种特殊的数据类型,它允许不同的数据类型共享同一块内存。结构体和联合体可以结合使用,实现一些有趣的功能。例如,我们可以定义一个结构体,它包含一个联合体成员:

c 复制代码
struct stu
{
    int num;
    char name[10];
    int age;
    union {
        char gender;
        int id;
    } info;
};

这里,info是一个联合体成员,它既可以存储一个字符(gender),也可以存储一个整数(id)。我们可以通过联合体的成员名来访问它:

c 复制代码
struct stu student = {1001, "Alice", 20};
student.info.gender = 'F';
printf("Student Name: %s, Gender: %c\n", student.name, student.info.gender);

结构体与位字段

位字段是结构体的一个特殊特性,它允许我们定义结构体成员的位宽度。这在处理硬件接口或需要节省内存的场景中非常有用:

c 复制代码
struct stu
{
    int num : 16;  // num占用16位
    int age : 8;   // age占用8位
};

这里,num成员占用16位,age成员占用8位。

不过,位字段的使用需要谨慎一些,因为它的行为可能会因编译器而异


总结

结构体是C语言中一个非常重要的概念,它允许我们将多个不同类型的数据组合在一起,形成一个逻辑上的整体。

关注窝,每三天至少更新一篇优质c语言题目详解~

[专栏链接QwQ] :⌈c语言日寄⌋CSDN

[关注博主ava]:siy2333

感谢观看~ 我们下次再见!!

相关推荐
熊文豪4 分钟前
深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化
人工智能·算法
Tester_孙大壮39 分钟前
第4章:Python TDD消除重复与降低依赖实践
开发语言·驱动开发·python
m0_748240541 小时前
AutoSar架构学习笔记
笔记·学习·架构
数据小小爬虫2 小时前
如何使用Python爬虫获取微店商品详情:代码示例与实践指南
开发语言·爬虫·python
代码驿站5202 小时前
JavaScript语言的软件工程
开发语言·后端·golang
java1234_小锋2 小时前
Java中如何安全地停止线程?
java·开发语言
吴秋霖3 小时前
最新百应abogus纯算还原流程分析
算法·abogus
一只会飞的猪_3 小时前
国密加密golang加密,java解密
java·开发语言·golang