- C编程教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 死循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - 返回语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - 空指针
- C语言 - void 指针
- C语言 - 悬空指针
- C语言 - 解引用指针
- C语言 - 近、远和巨型指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的比较
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点(.)运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和打包
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入与输出
- C语言 - 文件I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 编译指示
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类别
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C编程资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言中的结构体和函数
在C编程中,struct是一种派生数据类型。就像我们可以传递基本数据类型的参数一样,也可以将struct数据类型的变量传递给函数。您还可以使用值传递和引用传递方法传递结构体。C语言中的函数也可以返回struct数据类型。
阅读本章以了解以下概念:
- 如何传递struct类型的元素
- 如何传递struct变量
- 如何从函数返回struct
- 如何返回struct指针
让我们从第一个开始,学习如何传递struct类型的元素。
如何传递结构体元素
派生类型是由一个或多个任何基本类型的元素以及其他派生类型组合而成的。可以按值或按引用将元素传递给函数。
示例
在下面的示例中,我们有一个名为“rectangle”的派生类型,它包含两个元素。我们有一个struct变量“r”,其元素为“r.len”和“l.brd”,它们被传递给一个函数。然后,area()函数计算矩形的面积。
#include <stdio.h> struct rectangle{ float len, brd; }; int area(float, float); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(r.len, r.brd); return 0; } int area(float a, float b){ double area = (double)(a*b); printf("Length: %f \nBreadth: %f \nArea: %lf\n", a, b, area); return 0; }
输出
运行此代码时,将产生以下输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何传递结构体变量
让我们修改上面的示例,将struct变量本身(而不是其元素)传递给area()函数。“rectangle”结构体类型还有一个名为“area”的附加元素。
示例
在函数内部,通过点运算符(.)访问struct变量的元素,并计算面积。
#include <stdio.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(r); return 0; } int area(struct rectangle r){ r.area = (double)(r.len*r.brd); printf("Length: %f \nBreadth: %f \nArea: %lf\n", r.len, r.brd, r.area); return 0; }
输出
运行代码并检查其输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何从函数返回结构体
我们知道C语言中的函数可以返回任何类型的返回值。在这个例子中,area()函数被定义为返回一个struct变量。
示例
在main()函数内部,长度和宽度的输入被传递给area()函数。在area()函数内部,计算面积并填充struct变量,然后将其返回给main()函数,在main()函数中显示其元素。
#include <stdio.h> struct rectangle { float len, brd; double area; }; struct rectangle area(float x, float y); int main(){ struct rectangle r; float x, y; x = 10.5; y = 20.5; r = area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r.len, r.brd, r.area); return 0; } struct rectangle area(float x, float y){ double area = (double)(x*y); struct rectangle r = {x, y, area}; return r; }
输出
运行此代码时,将产生以下输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何按引用传递结构体
在C语言中,可以定义函数使其参数按值或按引用传递。引用是指向现有变量的指针。
示例
在这个例子中,在main()中声明了一个“rectangle”类型的struct变量,并将它的地址传递给一个名为area()的用户定义函数。
调用area()函数时,它可以使用间接运算符(→)使用变量的元素。它计算结果并将其赋值给area元素“r → area”。
#include <stdio.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle *); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(&r); return 0; } int area(struct rectangle *r){ r -> area = (double)(r -> len * r -> brd); printf("Length: %f \nBreadth: %f \nArea: %lf\n", r -> len, r -> brd, r -> area); return 0; }
输出
运行代码并检查其输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何返回结构体指针
让我们重写上面的代码来定义area()函数并返回指向rectangle数据类型struct的指针。
示例
area()函数有两个按值传递的参数。main()函数从用户读取长度和宽度并将它们传递给area()函数,area()函数填充一个struct变量并将它的引用返回给main()函数。
#include <stdio.h> struct rectangle { float len, brd; double area; }; struct rectangle * area(float x, float y); int main (){ struct rectangle *r; float x, y; x = 10.5; y = 20.5; r = area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r->len, r->brd, r->area); return 0; } struct rectangle * area(float x, float y){ double area = (double)(x*y); static struct rectangle r; r.len = x; r.brd = y; r.area = area; return &r; }
输出
运行此代码时,将产生以下输出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000