如何将数组传递给函数?

Posted

技术标签:

【中文标题】如何将数组传递给函数?【英文标题】:How to pass an array to a function? 【发布时间】:2016-04-09 14:17:24 【问题描述】:

代码:

void case1();
void case2();
void case3();
void case4();
void case5();

//Global variables
const int MAXROW = 5;
const int MAXCOL = 5;

int main()

    ........
    ...
MENU(with do while)


void case1()

    int A[MAXROW][MAXCOL] =  0 ;

    for (int r = 0; r < MAXROW; ++r)
        for (int c = 0; c < MAXCOL; ++c) 
            cout << "\n A[" << r << "][" << c << "]= ";
            cin >> A[r][c];
        


void case2()

    ...


//Function to find average of negatives
void case3()

    int negNumber = 0;
    double average = 0;

    for (int r = 0; r < 6; ++r) 
        for (int c = 0; c < 6; ++c) 
            if...


void case4()
//Function to find product of numbers different from 0
    ...


void case5()

    ...

如您所见,输入数组位于case1() 中。我想知道的是如何在所有其他函数中使用这个数组(case2case3case4case5)。

我该怎么做?

如何在菜单中调用它们?例如case2():

case '2': 
    case2(......);

目前我的错误列表中充满了类似

的消息

'A':未声明的标识符

【问题讨论】:

请通过editminimal reproducible example 提出您的问题。 你可以通过完全删除来稍微缩短它,但仍然没有那么接近最小。我建议您删除它,花一些时间重新编写(并重建您的示例),并且仅在您准备好取消删除和编辑它时。 (按原样,你只会收集反对票和接近票...) 在函数中本地定义的任何数组都不能在其他函数中看到。正如您所问的,您需要在全局范围内定义该数组(不是我认为这是一个好主意)。 【参考方案1】:

可以通过引用传递数组,例如:

void case1(int (&A)[MAXROW][MAXCOL])

  // do use array here

【讨论】:

【参考方案2】:

您应该在main 函数中声明您的数组,不是在您的case... 函数之一中。在 C++ 中,一旦执行超出定义对象的块,对象(包括数组)就会被销毁。所以在你的代码中

void case1()

    int A[MAXROW][MAXCOL] =  0 ;
    ...

一旦执行离开函数case1,数组A就会被销毁。当编译器抱怨未知名称A 时,它会尝试告诉您这一点。这不是你想要的!相反,请这样做:

int main()

    int A[MAXROW][MAXCOL] =  0 ;
    ...
    // your menu code
    ...
    switch (menu_result)
    
    case 1: case1(A); break;
    case 2: case2(A); break;
    case 3: case3(A); break;
    case 4: case4(A); break;
    case 5: case5(A); break;
    

在这里,您将数组A 传递给您的函数。为了使这段代码工作,你应该声明你的函数接收数组作为参数:

void case1(int (&A)[MAXROW][MAXCOL])

  // do use array here

(代码取自this答案)


顺便说一句,传递引用语法很少用于数组,因为即使您省略了引用符号&amp;,代码也可以工作:

void case2(int A[MAXROW][MAXCOL]) // also works; does the same


这种情况下,也可以省略数组的外维度:

void case3(int A[][MAXCOL]) // also works; does the same


这两个变体也可以工作的原因is a bit technical - 在这些变体中,传递的东西是指向一维数组的指针,而不是对二维数组的引用。我想避免提及它们,但这实际上是不可能的,因为它们被广泛使用(可能是因为它们可以被 C 编译器编译)。

【讨论】:

是的,一个case1中的错误消失了,但是如何在另一个fucntion中做到这一点。 [code]void case1(int (&A)[MAXROW][MAXCOL])[/code] 和case 1一样吗? 或类似 void case2(int A[][]) 或者这个:void case2 (int A[MAXROW][MAXCOL]) 是的,我试过了,但它们是新错误:错误 LNK2019 未解析的外部符号 "void __cdecl case3(int (* const)[5])" (?case3@@YAXQAY04H@Z) 引用函数_main. 我无法理解为什么这只适用于案例 3,4,5

以上是关于如何将数组传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将二维数组传递给函数[重复]

如何将数组传递给构造函数或类?

如何将自定义类型数组传递给 Postgres 函数

Bash - 如何将数组传递给函数,并在新函数中定义索引

如何将多维动态数组传递给C++中的函数

如何让 VBA 子例程调用将数组传递给子例程中的另一个函数的函数