当前位置: 首页 > backend >正文

【C语言】结构体详解

文章目录

  • 一、结构体的基本概念
    • 1.1结构体的声明
    • 1.2 结构体变量的创建
      • 1.2.1 在结构体声明同时创建
      • 1.2.2 在main函数中创建
    • 1.3 结构体变量的初始化
      • 1.3.1 按照默认顺序
      • 1.3.2 指定成员初始化
      • 1.4 结构体成员访问
    • 二、结构体的代码示例
      • 1. 结构体数组
      • 2. 结构体作为函数参数
      • 3. 结构体嵌套

一、结构体的基本概念

C语言已经提供了内置类型,如char,short,float,double等,这些内置类型无法描述一个复杂的对象。因此C语言提供了结构体这种自定义的数据类型。它允许我们将不同类型的数据组合在一起,形成一个新的自定义数据类型。这一特性极大地增强了 C 语言处理复杂数据的能力,在实际编程中有着广泛的应用。

1.1结构体的声明

结构体使用关键字 struct 来定义

例如,想要描述一个学生:

struct student
{char name[20]; // 名字int age; //年龄double height; //身高double weight; //体重char id[16]  //学号
};//分号不可以少

结构体是一些值的集合,这些值称为成员变量。结构体中的每个成员可以是不同的数据类型,如标量,数组,指针甚至是其他结构体。

1.2 结构体变量的创建

1.2.1 在结构体声明同时创建

struct student
{char name[20]; int age; double height ;double weight; char id[16]  
} s1,s2;

结构体声明时,创建变量是可选选项。此时创建的s1,s2是全局变量

1.2.2 在main函数中创建

#include <stdio.h>
struct student
{char name[20];int age;double height;double weight;char id[16]
};
int main( )
{struct student s3;struct student s4;return 0;
}

此时创建的变量是局部变量

1.3 结构体变量的初始化

1.3.1 按照默认顺序

struct student s3 = {"daisy",20,170,50,"2410"};

如果结构体成员变量中包含结构体:

#include <stdio.h>struct S
{char c;int n;
};struct A
{struct S s;int* p;char arr[10];
};int main() 
{struct A a = { {'1',1},NULL,"hhhh"};
}

1.3.2 指定成员初始化

struct student s3 = {.age = 30,.weight=60,.name="Rare",.height=180,.id="2410"};

1.4 结构体成员访问

使用操作符.可以访问结构体中的成员
在这里插入图片描述

例如:打印结构体成员:

#include <stdio.h>struct student
{char name[20]; // 名字int age; //年龄double height; //身高double weight; //体重char id[16];  //学号
};int main() 
{struct student s1 = {"daisy",20,170,50,"2410"};printf("%s %d %f %f %s\n",s1.name, s1.age,s1.height,s1.weight,s1.id);
}

在这里插入图片描述

如果结构体变量是指针类型,则需要使用“->”运算符来访问成员,格式为:

结构体指针->成员名

例如:

struct Student *p = &stu1;
p->age = 19;  // 等价于(*p).age = 19

二、结构体的代码示例

1. 结构体数组

结构体数组是由多个相同结构体类型的变量组成的数组。

#include <stdio.h>struct Book {char title[50];char author[30];float price;
};int main() {// 定义并初始化结构体数组struct Book books[3] = {{"C语言程序设计", "谭浩强", 39.8},{"数据结构", "严蔚敏", 45.0},{"计算机网络", "谢希仁", 42.5}};// 遍历结构体数组并输出信息for (int i = 0; i < 3; i++) {printf("第%d本书:\n", i + 1);printf("书名:%s\n", books[i].title);printf("作者:%s\n", books[i].author);printf("价格:%.1f\n\n", books[i].price);}return 0;
}

运行结果:

第1本书:
书名:C语言程序设计
作者:谭浩强
价格:39.8第2本书:
书名:数据结构
作者:严蔚敏
价格:45.0第3本书:
书名:计算机网络
作者:谢希仁
价格:42.5

2. 结构体作为函数参数

结构体可以作为函数的参数进行传递,既可以传递结构体变量本身(值传递),也可以传递结构体指针(地址传递)。

  • 值传递:函数接收的是结构体变量的一个副本,在函数内部对结构体成员的修改不会影响原变量。
#include <stdio.h>struct Point {int x;int y;
};// 值传递结构体参数
void printPoint(struct Point p) {printf("点的坐标:(%d, %d)\n", p.x, p.y);p.x = 10;  // 修改副本的成员,不影响原变量p.y = 20;
}int main() {struct Point p = {3, 4};printPoint(p);printf("原变量坐标:(%d, %d)\n", p.x, p.y);  // 原变量未被修改return 0;
}

运行结果:

点的坐标:(3, 4)
原变量坐标:(3, 4)
  • 地址传递:函数接收的是结构体变量的地址,通过指针可以访问和修改原结构体变量的成员。
#include <stdio.h>struct Point {int x;int y;
};// 地址传递结构体参数
void modifyPoint(struct Point *p) {p->x = 10;  // 修改原变量的成员p->y = 20;
}int main() {struct Point p = {3, 4};modifyPoint(&p);printf("修改后坐标:(%d, %d)\n", p.x, p.y);  // 原变量被修改return 0;
}

运行结果:

修改后坐标:(10, 20)

3. 结构体嵌套

结构体的成员可以是另一个结构体,这就是结构体的嵌套。

#include <stdio.h>// 定义日期结构体
struct Date {int year;int month;int day;
};// 定义学生结构体,其中包含Date类型的成员
struct Student {char name[20];struct Date birthday;float score;
};int main() {// 初始化嵌套结构体变量struct Student stu = {"Bob",{2003, 5, 15},92.0};// 访问嵌套结构体的成员printf("姓名:%s\n", stu.name);printf("生日:%d年%d月%d日\n", stu.birthday.year, stu.birthday.month, stu.birthday.day);printf("成绩:%.1f\n", stu.score);return 0;
}

运行结果:

姓名:Bob
生日:2003年5月15日
成绩:92.0
http://www.xdnf.cn/news/16905.html

相关文章:

  • 无人机集群协同三维路径规划,采用冠豪猪优化器(Crested Porcupine Optimizer, CPO)实现,Matlab代码
  • Jetpack Compose for XR:构建下一代空间UI的完整指南
  • C++引用:高效安全的别名机制详解
  • 途游Android面试题及参考答案
  • pytorch 安装
  • 机器翻译的分类:规则式、统计式、神经式MT的核心区别
  • 计算用户日活:从数据设计到可视化的全流程(高频场景题)
  • 深入掌握 ExcelJS:Node.js 中强大的 Excel 操作库
  • RAG 知识库实战指南:基于 Spring AI 构建 AI 知识问答应用
  • GaussDB case when的用法
  • 在win上安装最新的X-anylabeling以及sam2来帮助进行全自动追踪标注
  • 多模态后训练反常识:长思维链SFT和RL的协同困境
  • Git 常用命令指南:从入门到高效开发
  • 【Qt】QObject::startTimer: Timers cannot be started from another thread
  • 考研复习-计算机组成原理-第二章-数据的表示和运算
  • Kazam产生.movie.mux后恢复视频为.mp4
  • 第三章-提示词-高级:开启智能交互新境界(13/36)
  • Steam饥荒联机版多人服务器搭建全解析 -- 阿里云Linux系统构建云服务器
  • MPLS LSP
  • Mysql深入学习:慢sql执行
  • C语言基础03——数组——习题
  • 时序论文44 | TwinsFormer:通过两个交互组件重构时间序列内在依赖关系
  • 14. 最长公共前缀
  • 8-verilog-串口接收与发送模块
  • docker 可用镜像列表(长期免费)
  • 嵌入式硬件篇---Openmv
  • Java 高频面试考点(下)
  • 【MySQL安全】什么是SQL注入,怎么避免这种攻击:前端防护、后端orm框架、数据库白名单
  • ELECTRICAL靶机
  • SQL157 更新记录(一)