函数中结构体的传递

本文通过两个函数对比展示了在C语言中如何使用结构体指针传递参数来修改原始结构体变量的内容,并解释了为什么直接传递结构体副本无法达到同样的效果。
 

#include <stdio.h>

typedef struct Mystruct
{
 int iTest;
}Mystruct,*LPMystruct;


void Test(LPMystruct s )
{
 s->iTest = 8; 
}

void Test2(Mystruct s )
{
 s.iTest = 7; 
}

int main(int argc, char *argv[])
{
  
 Mystruct s1;
 s1.iTest = 3;
 printf("%d\n",s1.iTest);
 Test(&s1);
 printf("%d\n",s1.iTest);
 Test2(s1);                  //改变不了s.Itest 的值,还是8
 printf("%d\n",s1.iTest);
 
 return 0;
}

### 函数传递结构体的方式 在 C 和 C++ 中,可以通过两种主要方式将结构体作为函数参数进行传递:按值传递和按引用传递。 #### 按值传递 当通过值传递结构体时,整个结构体会被复制并传递函数内部。这种方式适合于小型结构体,但对于大型结构体来说可能会带来性能开销。以下是使用按值传递的一个简单示例: ```c #include <stdio.h> typedef struct { int id; char name[50]; } Student; void ShowStudentByValue(Student stu) { printf("ID: %d, Name: %s\n", stu.id, stu.name); // 输出学生信息[^1] } int main() { Student stu = {1, "Alice"}; ShowStudentByValue(stu); return 0; } ``` 在这个例子中,`ShowStudentByValue` 接收了一个 `Student` 类型的副本,并打印其成员值。 --- #### 按引用传递 为了提高效率,通常会通过指针来传递结构体。这样可以避免拷贝整个结构体数据,仅传递内存地址即可。下面是一个使用指针传递的例子: ```c #include <stdio.h> typedef struct { int id; char name[50]; } Student; void ShowStudentByPointer(const Student *stu) { if (stu != NULL) { printf("ID: %d, Name: %s\n", (*stu).id, (*stu).name); // 使用解引用操作符访问成员[^2] } } int main() { Student stu = {2, "Bob"}; ShowStudentByPointer(&stu); // 将 &stu 的地址函数 return 0; } ``` 在此代码片段中,`ShowStudentByPointer` 函数接收一个指向 `Student` 结构体的常量指针 (`const Student*`) 并利用该指针对应的数据执行操作。 --- #### 常见注意事项 - **按值传递**可能导致较大的内存消耗以及额外的时间用于复制对象。 - **按引用传递**更加高效,但在处理复杂逻辑或者修改原始数据时需谨慎对待可能引发的副作用。 - 如果希望保护原数据不受更改,则可以在声明形参时加上关键字 `const` 来限定不可变性。 --- ### 总结 无论是采用哪种方法,在实际编程过程中都需要考虑程序的具体需求与运行环境特性做出合理的选择。对于大多数情况而言,推荐优先选用基于指针的形式来进行大尺寸或频繁使用的结构体输工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值