在 C 函数中通过指针传递结构数组以更新指针引用

Pass array of struct by pointer in C function to update pointer reference

C++ 允许通过引用传递,但在 C 中不允许。

问题是,如何使用 C 函数来更新对指针传递的结构数组的引用。

我的问题可以用代码更好的解释。

enum ch_numbers {
        CH_00,
        CH_01,
        CH_02,
        CH_03,
        CH_04,
        CH_05,
    };

    enum sen_numbers {
        SEN_0,
        SEN_1,
        SEN_2,
        SEN_3,
        SEN_4,
    };

    struct ch_sen_map {
        enum ch_numbers ch_num;
        enum sen_numbers sen_num;
    };

    struct ch_sen_map map1[] = {
        {CH_02, SEN_3},
        {CH_03, SEN_1},
        {CH_01, SEN_4},
    };

    struct ch_sen_map map2[] = {
        {CH_01, SEN_1},
        {CH_02, SEN_3},
        {CH_04, SEN_2},
    };

    void UpdateMap(struct ch_sen_map * map)
    {
        map = map1;
    }

    struct ch_sen_map * GetMap(void)
    {
        return map1;
    }

    void main()
    {
        int i;
        struct ch_sen_map *pMap;
        int mapsize = sizeof(map1)/sizeof(struct ch_sen_map);

        printf("\n Expected map1 (straight forward):");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", map1[i].ch_num, map1[i].sen_num);
        }

        pMap = map2;

        printf("\n Expected map2 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

        UpdateMap(pMap);  // Not working as I expect

        printf("\n Expected map1 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

        pMap = GetMap();

        printf("\n Expected map1 :");
        for (i=0; i<mapsize; i++) {
            printf("\n %d : %d", pMap[i].ch_num, pMap[i].sen_num);
        }

    }

并且,输出是:

 Expected map1 (straight forward):
 2 : 3
 3 : 1
 1 : 4
 Expected map2 :
 1 : 1
 2 : 3
 4 : 2
 Expected map1 :  < -- this is what I want to fix. 
 1 : 1   <-- These are map2 values, Not Map1 :( 
 2 : 3
 4 : 2
 Expected map1 :
 2 : 3
 3 : 1
 1 : 4

我基本上想要 rewrite/fix UpdateMap 函数,使其像 GetMap 一样工作,除了没有 return。 [我可能仍然没有道理]。

我希望调用函数定义映射指针 *pMap(在本例中为 main)。当我将此映射指针传递给函数 (UpdateMap) 时,UpdateMap 函数将更新指针值,指向 map1 或 map2。更重要的是,更新地图指针引用,以便接下来当 main 函数使用地图指针时,它指向由 UpdateMap 函数更新的地图。

上述代码中,UpdateMap获取*pMap作为函数参数,修改其值只能在该函数内使用。

如果你想更新一个指针,你需要传递一个指向那个指针的指针。

void UpdateMap(struct ch_sen_map ** map_ptr)
{
    *map_ptr = map1;
}

int main(void)
{

    struct ch_sen_map *pMap;

    UpdateMap(&pMap);
    // ...
}

顺便说一下,main 必须总是 return int

在您的 UpdateMap 函数中:

void UpdateMap(struct ch_sen_map * map)
{
    map = map1;
}

您更改了函数本地的 map 值,因此在函数外部看不到对其的更改。您需要接受指向 struct ch_sen_map * 的指针,即 struct ch_sen_map **,并取消引用该指针以更改它指向的内容。

因此将您的函数更改为:

void UpdateMap(struct ch_sen_map **map)
{
    *map = map1;
}

并这样称呼它:

UpdateMap(&pMap);