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



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作为函数参数,其值可以修改为仅在该函数中使用。

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);  

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

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

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

最新更新