【问题标题】:Pass array of struct by pointer in C function to update pointer reference在 C 函数中通过指针传递结构数组以更新指针引用
【发布时间】:2020-07-01 03:46:40
【问题描述】:

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

我基本上想重写/修复 UpdateMap 函数,使其像 GetMap 一样工作,除了没有返回。 [我可能仍然没有意义]。

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

在上面的代码中,UpdateMap 获取 *pMap 作为函数参数,它的值可以修改为只在该函数中使用。

【问题讨论】:

    标签: arrays c pointers pass-by-pointer


    【解决方案1】:

    如果要更新指针,则需要将指针传递给该指针。

    void UpdateMap(struct ch_sen_map ** map_ptr)
    {
        *map_ptr = map1;
    }
    
    int main(void)
    {
    
        struct ch_sen_map *pMap;
    
        UpdateMap(&pMap);
        // ...
    }
    

    顺便说一句,main 必须始终返回 int

    【讨论】:

      【解决方案2】:

      在您的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);  
      

      【讨论】:

      • 完美的解释。
      猜你喜欢
      • 2019-10-30
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多