回 帖 发 新 帖 刷新版面

主题:怎么实现这样一个传递二维数组的问题

定义一个函数,需要传入一个二维数组
void fnc(float a[][200],float bb)
{
   //比如实现的是一个二维数组的求和.............
}

现在需要循环调用这个这个函数,传入的是某个下标确定的三维数组,实际上也就是一个二维数组

for(int i=1;i<20;i++)
{
   fnc(c[][i][],cc[i])
}
请问这段伪码改如何实现啊?




回复列表 (共8个回复)

沙发

我想楼主这样fnc(c[][i][],cc[i])这样调用函数很有可能是错的。除非您的c是个5维数组,cc是1维数组。如果您的cc,c分别是这样声明的:float c[20][20][200], cc[20];可以这样调用fnc函数
fnc(c[合适的下标][i],cc[i]);

板凳

引用就可以

3 楼


C++我还是不怎么懂,过一项子我再去学C++.

4 楼

方法1:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
    int a[5][6][7];
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                a[i][j][k]=111;
            }
        }
    }
    fun(a);
    return 0;
}
//
int fun(int (*p)[6][7])
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                cout<<*(*(*(p+i)+j)+k)<<",";
            }
        }
    }
    return 0;
}
方法2:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
    int a[5][6][7];
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                a[i][j][k]=111;
            }
        }
    }
    fun(a);
    return 0;
}
//
int fun(int p[5][6][7])//此行有改变
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                cout<<*(*(*(p+i)+j)+k)<<",";
            }
        }
    }
    return 0;
}
方法3:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
    int a[5][6][7];
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                a[i][j][k]=111;
            }
        }
    }
    fun(a);
    return 0;
}
//
int fun(int p[5][6][7])
{
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<6;j++)
        {
            for(int k=0;k<7;k++)
            {
                cout<<p[i][j][k]<<",";//此行有改变
            }
        }
    }
    return 0;
}

5 楼

回 强强 :
您上面给出的代码,把cout改成printf好像也可以看做是纯C吧?
在C中,
int fun(int (*p)[6][7]);
int fun(int p[5][6][7]);
int fun(int p[ ][6][7]);
这3个申明完全是等价的,都被解释为int fun(int (*p)[6][7]);
还有*(*(*(p+i)+j)+k); 和p[i][j][k];也完全是等价的,都被解释为*(*(*(p+i)+j)+k); 
数组用下标访问它的值的时候也是用指针来实现的吧,如p[n]和*(p+n)或者*(n+p)或者n[p]这几个完全等价。就是这个原因,在把数组做函数形参的时候,除了第一个下标,其他的药全部给出,不然如果有int fun(int p[][][]),如果有p[i][j][k],系统就不知道p+i到底应该是多少,就跟void*是不能有加法一样。

应该C++中的引用不是这样的吧?

6 楼

[quote]回 强强 :
您上面给出的代码,把cout改成printf好像也可以看做是纯C吧?
在C中,
int fun(int (*p)[6][7]);
int fun(int p[5][6][7]);
int fun(int p[ ][6][7]);
这3个申明完全是等价的,都被解释为int fun(int (*p)[6][7]);
还有*(*(*(p+i)+j)+k); 和p[i][j][k];也完全是等价的,都被解释为*(*(*(p+i)+j)+k); 
数组用下标访问它的值的时候也是用指针来实现的吧,如p[n]和*(p+n)或者*(n+p)或者n[p]这几个完全等价。就是这个原因,在把数组做函数形参的时候,除了第一个下标,其他的药全部给出,不然如果有int fun(int p[][][]),如果有p[i][j][k],系统就不知道p+i到底应该是多少,就跟void*是不能有加法一样。

应该C++中的引用不是这样的吧?
[/quote]
嘿嘿嘿,说的是,上面写的不是引用,呵呵,我忘说了,就是在纯C中的,可能是我用"方法"这个词不太恰当,应该是"写法",哈哈

7 楼

用"引用"应该比这简单多了,呵呵,感谢热心的windy0will

8 楼

改用vector就行了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册