函数参数:指向对象数组的指针

5
在我的主函数中,我创建了一个特定类别"菜单(Menu)"的对象数组。
当我调用一个函数时,我想要提供指向该数组的指针。
Menu menu[2];
// Create menu [0], [1]
Function(POINTER_TO_ARRAY);

问题:如何正确书写函数参数?

我尝试过:

Function(&menu);

并在头文件中:

void Function(Menu *menu[]); // not working
error: Cannot convert parameter 1 from Menu(*)[2] to Menu *[]

void Function(Menu * menu); // not working
error: Cannot convert parameter 1 from Menu(*)[2] to Menu *[]

我想不出其他方法来解决这个问题,也找不到这个特定问题的解决方案。
简单来说,我想通过一个指针在函数内访问菜单数组。普通指针和指向数组的指针有什么区别?
4个回答

10

声明:

void Function(Menu* a_menus); // Arrays decay to pointers.

调用:

Function(menu);

然而,您需要通知Function()数组中有多少条目。由于这是C++,建议使用具有其大小、开头和结尾知识的std::arraystd::vector

std::vector<Menu> menus;
menus.push_back(Menu("1"));
menus.push_back(Menu("2"));

Function(menus);

void Function(const std::vector<Menu>& a_menus)
{
    std::for_each(a_menus.begin(),
                  a_menus.end(),
                  [](const Menu& a_menu)
                  {
                      // Use a_menu
                  });
}

3
无论是const指针还是非const指针
void Function(Menu const* menu);
void Function(Menu* menu);

...或通过const或非const引用

void Function(Menu const (&menu)[2]);
void Function(Menu (&menu)[2]);

可以推广到一个模板中,以便数组大小将由编译器推导出来:

template<size_t N> void Function(Menu const (&menu)[N]);
template<size_t N> void Function(Menu (&menu)[N]);

始终将其称为 Function(menu);


3

如果您使用以下内容,则应该可以正常工作:

 void Function(Menu * menu); 

并使用调用
Function(menu);  

代替
Function(&menu); 

传递数组名称会导致它衰减为指向包含在数组中的类型的指针。但是,正如@hmjd在他的答案中所说,您还需要传递数组大小,因此如果可以使用向量,则他建议使用向量。


0

您可以使用

Function((void *) whatever_pointer_type_or_array_of_classes);

在你的主函数中。
还有在这个函数中:
type Function(void * whatever)
{
    your_type * x =(your_type *) whatever;
    //use x 
    ....
    x->file_open=true;
    ....
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接