如何将数组传递给函数?
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()
中。我想知道的是如何在所有其他函数中使用这个数组(case2
、case3
、case4
、case5
)。
我该怎么做?
如何在菜单中调用它们?例如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答案)
顺便说一句,传递引用语法很少用于数组,因为即使您省略了引用符号&
,代码也可以工作:
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以上是关于如何将数组传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章