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