c - 使用单指针代替双指针
问题描述
在下面的 C 代码中,我想使用指向 simple_struct 的单个指针访问主函数中的 foo_array。可能吗?我问这个是因为出于某种原因,框架不允许我将双指针作为函数参数传递。
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int a;
float b;
} simple_struct;
void get_foo_value(simple_struct **foo_p)
{
simple_struct foo_array[2] = {{1,2.1},
{3,4.1}};
*foo_p = foo_array;
}
int main()
{
simple_struct *foo_p = 0;
get_foo_value(&foo_p);
}
解决方案
通常,当我们想要返回一个值时,我们使用return
.
simple_struct *get_foo_value(void) {
simple_struct *foo = malloc(...);
// Initialize *foo...
return foo;
}
{
simple_struct *foo = get_foo_value();
}
但可能返回值用于其他用途。在这种情况下,我们可以使用参数。参数变量是其函数的局部变量,因此对其值的更改对调用者没有影响。所以当我们想要一个函数在调用者中改变一个变量时,我们传递一个指向该变量的指针。这意味着如果我们想使用参数返回一个指针,我们必须使用一个指向指针的指针。
void get_foo_value(simple_struct **foo_ptr) {
*foo_ptr = malloc(...);
// Initialize **foo_ptr...
}
{
simple_struct *foo;
get_foo_value(&foo);
}
但你想要替代品。
您可以将指针包装在结构中。
typedef struct {
simple_struct *ptr;
} simple_struct_ptr;
void get_foo_value(simple_struct_ptr *rv) {
simple_struct *foo = malloc(...);
// Initialize *foo...
rv->ptr = foo;
}
{
simple_struct_ptr foo_ptr;
get_foo_value(&foo_ptr);
simple_struct *foo = foo_ptr.ptr;
}
您可以将指针包装在 typedef 中。
typedef simple_struct *simple_struct_ptr;
void get_foo_value(simple_struct_ptr *rv) {
simple_struct *foo = malloc(...);
// Initialize *foo...
*rv = foo;
}
{
simple_struct *foo;
get_foo_value(&foo);
}
这两种解决方案都将被视为不好的做法。隐藏指针是指针的事实会妨碍可读性。
推荐阅读
- python - 如何在 Python 函数最小化中加快速度以找到椭圆方程的解
- python - 如何找出策略迭代的值?
- python - 重塑时的Tensorflow尺寸错误
- ios - iOS应用程序从浏览器在webview中加载url
- google-cloud-functions - Firebase/Google 云功能 - 是否可以挂钩云功能错误事件?
- python - 让python脚本运行一分钟
- c# - LINQ Group by with where 条件在数据表中使用 C# asp.net
- xamarin.forms - 关闭 MvxMasterDetailPage
- django - 升级后是否需要备份数据库?
- sass - 无法导入断点 sass 和 compass