首页 > 解决方案 > 使用单指针代替双指针

问题描述

在下面的 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);
}

标签: cdouble-pointer

解决方案


通常,当我们想要返回一个值时,我们使用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);
}

这两种解决方案都将被视为不好的做法。隐藏指针是指针的事实会妨碍可读性。


推荐阅读