c - 按值返回与按引用返回时有哪些注意事项 - Set ADT C

标签 c set pass-by-reference adt pass-by-value

当查看 C 中 Set ADT 的头文件时,我试图理解为什么函数 setUnion 或 setIntersection 是这样声明的:

Set setUnion(Set set1, Set set2); 
Set setIntersection(Set set1, Set set2);

我找不到实现,但我假设在这些函数中,我们分配更多空间并创建新集,然后添加所有必要的元素。 我认为 set1 和 set2 是通过引用传递的,那么为什么不更新其中一个并保存内存分配并只返回一些枚举来通知更新是否成功呢? (例如我们可以更新左侧参数)。

如果它们不是通过引用传递的,我如何更改签名才能这样做?

谢谢!

最佳答案

Set 几乎可以肯定是隐藏在 typedef 后面的指针,因此内部 struct 的引用确实存在,这才是最重要的。

<小时/>

通常不需要需要计算两个集合的并集或交集而不改变其中任何一个。事实上很有可能

Set result = setIntersection(set1, set2);
freeSet(set1);
set1 = result;

性能不会比您建议的替代方案低

setIntersectionInPlace(set1, set2);

而使用 setIntersectionInplace 计算不可变集合的交集的更常见情况则需要编写

Set result = setCopy(set1);
setIntersectionInplace(result, set2);

这会生成 set1不必要的副本,该副本较大或等于结果的大小

关于c - 按值返回与按引用返回时有哪些注意事项 - Set ADT C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57951932/

相关文章:

java - Java 中通过引用传递类型

c - 为什么套接字描述符得到-1?

计算可被 k 整除的 m 元素集的 n 元素子集的算法

ruby-on-rails - Ruby如何修改参数

java - 方法签名中的 <E> 是什么?

python - 如何在python中构造一组列表项?

c++ - 使用指针引用传递特定的数组元素

从 C 函数调用/执行 node.js 脚本

php - linux下通过PHP网页运行C编译程序

c - 闰年逻辑困惑