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

大话C语言:第41篇 结构体与函数的关系

1 结构体作为函数的参数

结构体作为函数的参数,存在两种传递方式:

  • 值传递:将结构体的值拷贝一份传递给函数,函数内部对该结构体的修改不会影响到原来的结构体变量。

代码示例:

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct Student 
{  char name[20];  int age;  float score;  
};  // 函数定义
void ShowStudent(struct Student stu) 
{strcpy(stu.name, "jack");stu.age = 22;stu.score = 98.5f;printf("ShowStudent函数里,该学生:%s, %d, %.1f\n", stu.name, stu.age, stu.score);
}int main() 
{// 定义结构体变量struct Student stu = {"peter", 20, 90.5f};// 调用函数,值传递ShowStudent(stu);// 打印成员变量printf("main函数里,该学生:%s, %d, %.1f\n", stu.name, stu.age, stu.score);return 0;
}
  • 地址传递:将结构体的地址传递给函数,函数内部可以通过该地址来访问原变量,并对其进行修改。

代码示例:

#include <stdio.h>
#include <string.h>// 结构体类型的定义
struct Student 
{  char name[20];  int age;  float score;  
};  // 函数定义
void ShowStudent(struct Student *stu) 
{strcpy(stu->name, "jack");stu->age = 22;stu->score = 98.5f;printf("ShowStudent函数里,该学生:%s, %d, %.1f\n", stu->name, stu->age, stu->score);
}int main() 
{// 定义结构体变量struct Student stu = {"peter", 20, 90.5f};// 打印成员变量printf("main函数里,ShowStudent函数调用前,该学生:%s, %d, %.1f\n", stu.name, stu.age, stu.score);// 调用函数,值传递ShowStudent(&stu);// 打印成员变量printf("main函数里,ShowStudent函数调用后,该学生:%s, %d, %.1f\n", stu.name, stu.age, stu.score);return 0;
}

2 结构体作为函数的返回值

结构体作为函数的返回值,存在两种返回方式:

  • 直接返回结构体:如果结构体较小,内容简单,可以直接将其作为函数的返回值。这种方式简单直观,不需要额外的内存管理操作。

代码示例:

#include <stdio.h>// 结构体类型的定义
struct Student 
{  char name[20];  int age;  float score;  
};// 直接返回结构体
struct Student GenerateStudent()
{struct Student stu = {"peter", 20, 90.5f};return stu;
}int main()
{struct Student stu = GenerateStudent();printf("该学生:%s, %d, %.1f\n", stu.name, stu.age, stu.score);return 0;
}

注意,当结构体较大时,直接返回可能会导致性能问题,因为函数返回时会复制整个结构体。

  • 返回结构体指针:当结构体较大或者需要在函数外部修改结构体内容时,通常使用返回结构体指针的方式。这样可以避免大量数据的复制,提高性能。

代码示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 结构体类型的定义
struct Student 
{  char name[20];  int age;  float score;  
}; struct Student* GenerateStudent() 
{  struct Student *stu = (struct Student*)malloc(sizeof(struct Student));  if (stu != NULL) {  strcpy(stu->name, "jack");stu->age = 22;stu->score = 98.5f;}return stu; // 返回结构体指针  
}  int main()
{  struct Student *stu = GenerateStudent();  if (stu != NULL) {  printf("该学生:%s, %d, %.1f\n", stu->name, stu->age, stu->score);// 使用完毕后释放内存   free(stu); stu = NULL;}  return 0;  
}

注意,使用结构体指针需要谨慎处理内存管理问题,避免内存泄漏或野指针等问题。


http://www.mrgr.cn/news/1945.html

相关文章:

  • 云原生 | Kubernetes 之常用 CNI 网络插件简述与对比
  • 保存数据至后台表
  • Java 安全编程:揭秘加密与解密的艺术
  • 未开启语音助手时,远程控制功能助你快速在家找回手机!
  • C语言 【自定义类型——结构体】(详细)
  • [C#]winform基于深度学习算法MVANet部署高精度二分类图像分割onnx模型高精度图像二值化
  • 人工智能缺陷检测方案METIS(梅迪斯):汽车零部件检测
  • MySQL单表条件查询语句
  • 【页面提取】将搜索到的内容进行截屏保存,搜索到的标题及链接输出到电子表格
  • 探索 Resolume Arena 7 - 引领 VJ 音视频创作的卓越软件
  • 【AI学习】LLaMA模型的微调成本有几何?
  • spark client mode cluster mode 区别 与选择
  • C#中的S7协议
  • python_tutorials_t1,print input操作
  • JMeter常见的高频面试题整理
  • 【前缀和算法】--- 一维和二维前缀和模板
  • jenkins 发布镜像清理
  • LLM才硬件(显存)需求
  • 《AI视频类工具之十六——​ Apple Motion》
  • Vue UI 组件库