解释C ++程序(将多维数组传递给函数)

时间:2015-04-24 17:17:22

标签: c++ arrays function

以下程序编译并正确运行,但5中的值int sum(int p[5][30][20],int n)会被忽略,为什么?

int sum(int p[5][30][20],int n)
{
    int s=0;
    for(int i=0; i<n; i++)
    for(int j=0; i<30; j++)
    for(int k=0; i<20; k++)
    s+=p[i][j][k];
    return s;
}

...
int x[40][30][20];
int s=sum(x,40);

在函数中,它是int p[5][30][20],但对于函数调用,使用x[40][30][20],但它可以正常工作。

我很感激能帮助我解释它。

1 个答案:

答案 0 :(得分:2)

函数中最外层的循环

int sum(int p[5][30][20],int n)
{
    int s=0;
    for(int i=0; i<n; i++)
    for(int j=0; i<30; j++)
    for(int k=0; i<20; k++)
    s+=p[i][j][k];
    return s;
}

从0到n迭代,其中n从函数调用

开始
int s=sum(x,40);

等于40。

当数组按值传递给函数时,它会被隐式转换为指向其第一个元素的指针。所以这些函数声明

int sum( int p[5][30][20],int n);
int sum( int p[40][30][20],int n);
int sum( int p[][30][20],int n);
int sum( int ( *p )[30][20],int n);

是等效的,并声明相同的一个函数。

您可以在程序中同时使用所有这四个声明。虽然函数本身只能定义一次。

例如

int sum( int p[5][30][20],int n);
int sum( int p[40][30][20],int n);
int sum( int p[][30][20],int n);
int sum( int ( *p )[30][20],int n);

int sum(int p[1000][30][20],int n)
{
    int s=0;
    for(int i=0; i<n; i++)
    for(int j=0; i<30; j++)
    for(int k=0; i<20; k++)
    s+=p[i][j][k];
    return s;
}

在函数p中是指向int [30][20]类型的对象的指针(原始数组的第一个元素)

通过引用传递数组时会出现不同的情况。例如,如果您的函数声明为

int sum(int ( &p )[5][30][20] );

然后编译器将为调用发出错误

int s=sum(x);

因为x的类型与函数参数的数组类型不同。