以下程序编译并正确运行,但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]
,但它可以正常工作。
我很感激能帮助我解释它。
答案 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的类型与函数参数的数组类型不同。