前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[c语言日寄]结构体的使用及其拓展

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

作者头像
siy2333
发布2025-02-05 12:50:50
发布2025-02-05 12:50:50
5600
代码可运行
举报
文章被收录于专栏:来自csdn的博客来自csdn的博客
运行总次数:0
代码可运行

前言

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

题目引入

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

代码语言:javascript
代码运行次数:0
复制
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关键字,后面跟着结构体名称和花括号{}括起来的成员列表

代码语言:javascript
代码运行次数:0
复制
struct stu
{
    int num;
    char name[10];
    int age;
};

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

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

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

代码语言:javascript
代码运行次数:0
复制
struct stu a;//创建结构体变量

结构体变量的初始化

1. 直接初始化

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

代码语言:javascript
代码运行次数:0
复制
struct stu student = {1001, "Alice", 20};

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

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

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

代码语言:javascript
代码运行次数:0
复制
struct stu student;
student.num = 1002;
strcpy(student.name, "Bob");//使用了strcpy函数来为name成员赋值,name是一个字符数组,不能直接用赋值运算符=来赋值。
student.age = 21;
3. 使用指针访问结构体成员

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

代码语言:javascript
代码运行次数:0
复制
struct stu *p = &student;
printf("Name: %s, Age: %d\n", p->name, p->age);

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

二、结构体数组的使用

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

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

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

遍历结构体数组

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

代码语言:javascript
代码运行次数:0
复制
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);
}

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

使用指针访问结构体数组

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

代码语言:javascript
代码运行次数:0
复制
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的指针作为参数:

代码语言:javascript
代码运行次数:0
复制
void fun(struct stu *p)
{
    printf("%s\n", (*p).name);
    return;
}

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

代码语言:javascript
代码运行次数:0
复制
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"。

返回结构体变量

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

代码语言:javascript
代码运行次数:0
复制
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变量,并将其返回。

四、程序分析与输出结果

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

代码语言:javascript
代码运行次数:0
复制
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语言中不仅仅是一个简单的数据组合工具,它还支持一些高级特性,这些特性使得结构体在复杂的应用场景中更加灵活和强大。

结构体嵌套

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

代码语言:javascript
代码运行次数:0
复制
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。

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

代码语言:javascript
代码运行次数:0
复制
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)是一种特殊的数据类型,它允许不同的数据类型共享同一块内存。结构体和联合体可以结合使用,实现一些有趣的功能。例如,我们可以定义一个结构体,它包含一个联合体成员:

代码语言:javascript
代码运行次数:0
复制
struct stu
{
    int num;
    char name[10];
    int age;
    union {
        char gender;
        int id;
    } info;
};

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

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

结构体与位字段

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

代码语言:javascript
代码运行次数:0
复制
struct stu
{
    int num : 16;  // num占用16位
    int age : 8;   // age占用8位
};

这里,num成员占用16位,age成员占用8位。 不过,位字段的使用需要谨慎一些,因为它的行为可能会因编译器而异

总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 题目引入
  • 一、结构体的定义与初始化
    • 结构体的定义
    • 结构体变量的初始化
      • 1. 直接初始化
      • 2. 使用点运算符(.)逐个赋值
      • 3. 使用指针访问结构体成员
  • 二、结构体数组的使用
    • 遍历结构体数组
    • 使用指针访问结构体数组
  • 三、函数与结构体
    • 函数参数传递
    • 返回结构体变量
  • 四、程序分析与输出结果
  • 五、结构体的高级特性
    • 结构体嵌套
    • 结构体与联合体
    • 结构体与位字段
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档