工程师进阶笔记 发表于 2025-4-16 17:50:00

嵌入式 C 语言基础知识,如何向函数内部传递结构信息?

星标+置顶,掌握嵌入式AIoT前沿技术资讯
点赞+关注,一起变得更加优秀!
在C语言中,结构体是一种非常强大的数据类型,可以用来组织和存储复杂的数据。本文将详细介绍如何将结构体及其成员传递给函数,并探讨相关的特性与注意事项。
1. 传递结构体成员
如果结构体的某个成员是基本数据类型(如int、double、char等),可以直接将该成员作为参数传递给函数。
以下是一个简单的示例,展示了如何将结构体的成员传递给函数进行计算:[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]#include #define FUNDLEN 50
struct funds {    char bank;    double bankfund;    char save;    double savefund;};
double sum(double, double);
int main(void) {    struct funds stan = {      "Garlic-Melon Bank",      4032.27,      "Lucky's Savings and Loan",      8543.94    };    printf("Stan has a total of $%.2f.
", sum(stan.bankfund, stan.savefund));    return 0;}
double sum(double x, double y) {    return x + y;}输出:[*]Stan has a total of $12576.21.这里,sum()函数并不关心参数是否来自结构体,它只关心传入的参数是double类型。
注意:如果需要在函数中修改结构体成员的值,则需要传递成员的地址。
2. 传递结构体的地址
当需要在函数中访问或修改整个结构体的数据时,可以将结构体的地址传递给函数。这种方式效率高,且避免了数据的复制。[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]#include #define FUNDLEN 50
struct funds {    char bank;    double bankfund;    char save;    double savefund;};double sum(const struct funds *);
int main(void) {    struct funds stan = {      "Garlic-Melon Bank",      4032.27,      "Lucky's Savings and Loan",      8543.94    };    printf("Stan has a total of $%.2f.
", sum(&stan));    return 0;}
double sum(const struct funds *money) {    return money->bankfund + money->savefund;}这里,sum()函数通过指针money访问结构体的成员。->运算符用于访问指针指向的结构体成员。
注意:使用const修饰指针可以避免意外修改原始数据。
3. 传递整个结构体
也可以将整个结构体作为参数传递给函数。这种方式会创建结构体的一个副本,因此不会影响原始数据。[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]#include #define FUNDLEN 50
struct funds {    char bank;    double bankfund;    char save;    double savefund;};double sum(struct funds);
int main(void) {    struct funds stan = {      "Garlic-Melon Bank",      4032.27,      "Lucky's Savings and Loan",      8543.94    };    printf("Stan has a total of $%.2f.
", sum(stan));    return 0;}
double sum(struct funds moolah) {    return moolah.bankfund + moolah.savefund;}这里,sum()函数接收一个结构体副本,并通过 . 运算符访问其成员。
4. 结构体的其他特性
4.1 结构体赋值
C语言允许将一个结构体赋值给另一个相同类型的结构体。例如:[*][*][*][*][*][*]struct names {    char first;    char last;};struct names a = {"Alice", "Smith"};struct names b = a; // 将a的值赋给b4.2 结构体作为返回值
函数可以返回一个结构体。例如:[*][*][*][*][*][*][*][*][*][*]struct vector {    double x;    double y;};struct vector sum_vect(struct vector a, struct vector b) {    struct vector result;    result.x = a.x + b.x;    result.y = a.y + b.y;    return result;}4.3 结构体指针 vs 结构体参数
结构体指针:传递效率高,但需要小心保护原始数据。结构体参数:传递的是副本,安全性更高,但可能增加内存开销。
5. 结构体中的字符数组与指针
在结构体中,可以使用字符数组或指针来存储字符串。以下是两种方式的对比:
5.1 字符数组[*][*][*][*]struct names {    char first;    char last;};字符串存储在结构体内部,安全性高,但占用固定大小的内存。
5.2 指针[*][*][*][*]struct pnames {    char *first;    char *last;};字符串存储在其他内存区域,结构体中只存储地址。这种方式更灵活,但需要小心内存管理。
注意:使用指针时,需避免未初始化的指针导致的潜在问题。
6. 动态内存分配与结构体
使用malloc()动态分配内存可以灵活管理字符串存储。例如:[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]struct namect {    char *fname;    char *lname;    int letters;};
void getinfo(struct namect *pst) {    char temp;    printf("Enter first name: ");    scanf("%s", temp);    pst->fname = (char *)malloc(strlen(temp) + 1);    strcpy(pst->fname, temp);    printf("Enter last name: ");    scanf("%s", temp);    pst->lname = (char *)malloc(strlen(temp) + 1);    strcpy(pst->lname, temp);}
void cleanup(struct namect *pst) {    free(pst->fname);    free(pst->lname);}注意:动态分配的内存需要通过 free() 释放,避免内存泄漏。
7. 结构体数组与函数
可以将结构体数组传递给函数,函数通过指针访问数组中的元素。例如:[*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*]#include #define FUNDLEN 50#define N 2
struct funds {    char bank;    double bankfund;    char save;    double savefund;};double sum(const struct funds money[], int n);
int main(void) {    struct funds jones = {      {"Garlic-Melon Bank", 4032.27, "Lucky's Savings and Loan", 8543.94},      {"Honest Jack's Bank", 3620.88, "Party Time Savings", 3802.91}    };    printf("The Joneses have a total of $%.2f.
", sum(jones, N));    return 0;}
double sum(const struct funds money[], int n) {    double total = 0;    for (int i = 0; i         total += money.bankfund + money.savefund;    }    return total;}输出:[*]The Joneses have a total of $20000.00.注意:数组名作为参数传递时,实际上是传递了数组首元素的地址。
-END-
往期推荐:点击图片即可跳转阅读


嵌入式开发者的效率神器:Serial-Studio实战解析!

嵌入式软件工程师,凌晨三点还在Debug,没想到故障竟然是。。。

科普嵌入式相关概念, CPU、MCU、MPU、SOC、MCM、NPU,分别代表什么?
星标+置顶,掌握嵌入式AIoT前沿技术资讯
点赞+关注,一起变得更加优秀!
页: [1]
查看完整版本: 嵌入式 C 语言基础知识,如何向函数内部传递结构信息?