嵌入式 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]