| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 17709 人关注过本帖
标题:C++中函数怎么返回一个二维数组。指针怎么指向二维数组?
只看楼主 加入收藏
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
难道C++中也没有指针指向二维数组的说法吗?兄弟我在线等答案啊。
2008-01-09 19:36
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
关于指针是怎么指二维数组是搞清楚了。应该这样。
void main()
{
int a[10][10]={0},(*p)[10];
p=a;
}
这样就是申明一个二维指针,指向二维数组。
那么新的问题产生了,一个自定义的函数怎么返回一个二维指针,也就是一个自定义函数要返回形如(*p)[n]的指针,应该要怎么申明?楼上的各位高手都说了,函数只能返回指针,但是当我试图返回一个二维指针时。编译器照样报错!
int *a();
void main()
{
    int b[10][10]={10},(*p1)[10];
 
      
  p1=b;//可以指向
  p1=a();//这一行是错的
   


}
int *a()
{   
    int (*p)[10],b[10][10]={2};
    p=b;
    return p;
}
到底应该怎么做才能返回一个二维数组啊????!!!

[[italic] 本帖最后由 VanHorn 于 2008-1-9 20:59 编辑 [/italic]]
2008-01-09 20:52
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
返回地址不行么?

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-01-09 21:07
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
怎么返回。请楼上的说具体一点?
2008-01-09 21:09
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
比如这样,它可以取得二维数组中的arr[0][2],即3:
程序代码:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}};
        return arr[0];
}

int main()
{
        cout << f()[2] << endl;
        system("pause");
        return 0;
}


[[italic] 本帖最后由 随心 于 2008-1-9 21:32 编辑 [/italic]]

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-01-09 21:31
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
如果是这样的话,f只返回了二维数组的第一行的地址。要在主函数中对数组进行第二行的元素进行操作是不行的。我能做的只是操作第一行的元素罢了,例如:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}};
        return arr[0];
}

int main()
{
    int *p;
    p=f();

    cout << *p << endl;//这里怎么操作指针p都只是对二维数组的第一行进行操作。
        system("pause");
        return 0;
}
而无法对第二行的元素进行操作。

[[italic] 本帖最后由 VanHorn 于 2008-1-9 22:20 编辑 [/italic]]
2008-01-09 21:45
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
收藏
得分:0 
size自己定義, 這裏簡以 2x2 數組

#include <iostream>
using namespace std;

int ** _2dAry()
{
    int **p;
    p = new int*[2];
    p[0] = new int[2];
    p[1] = new int[2];

    p[0][0] = 0;
    p[0][1] = 1;
    p[1][0] = 2;
    p[1][1] = 3;
    return p;
}

int main()
{
    int **myAry = _2dAry();
    // read-op
    cout << myAry[0][0] << ", " << myAry[0][1] << ", "
         << myAry[1][0] << ", " << myAry[1][1] << endl;
    // output: 0, 1, 2, 3

    // write-op
    myAry[0][0] = 4;
    myAry[0][1] = 5;
    myAry[1][0] = 6;
    myAry[1][1] = 7;

    cout << myAry[0][0] << ", " << myAry[0][1] << ", "
         << myAry[1][0] << ", " << myAry[1][1] << endl;
    // output: 4, 5, 6, 7
    delete myAry;  // (not need)

    system("pause");
    return 0;
}

原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2008-01-10 05:51
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
自己就一点也不动脑子吗?
程序代码:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}};
        return arr[0];
}

int main()
{
        cout << (f()+1)[2] << endl;
        system("pause");
        return 0;
}

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-01-10 08:23
随心
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:12
帖 子:2577
专家分:250
注 册:2007-8-12
收藏
得分:0 
数组是线性的,得到了起始地址,后面还不好办么?

天之道,利而不害。圣人之道,为而不争。信言不美,美言不信。善者不辩,辩者不善。知者不博,博者不知。
2008-01-10 08:25
VanHorn
Rank: 1
等 级:新手上路
帖 子:152
专家分:0
注 册:2008-1-8
收藏
得分:0 
好的,问题解决了。楼上的两位对于这个问题的解决一针见血。非常感谢。
    我最想要的结果是  27楼yeshirow的解决方式。返回一个“指向二维数组的指针”,这个结果比较直接。
    28楼随心的解决方式有个运算:“(f()+1)”,不是兄弟我不动脑筋,我之前确实没有见过这种运算。我一直认为f()返回的是一个地址,因此对一个地址加减,之后一定是要取值的,因此我在编译器里试的代码是:“*(f()+1)[2]”,结果当然没通过,所以我错误的认为操作第二行的元素是不可能的。还请随心耐心给讲解一下这个运算的意义?
    我觉得这个问题还是可以深入探讨一下的。既然f()返回的是一个指针(这时候可以认为它返回的是一个一维指针数组),那么给f()进行取地址的操作之后,f()就可以指向二维指针了。
例如:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}};
        return arr[0];
}

int main()
{
        int **p;
        p=&(f());//取f的返回值地址,这是不可以的。编译器报错。
        cout << **p<< endl;
        system("pause");
        return 0;
}
现在再对二维指针进行操作,就类似于达到了函数返回二维指针的效果了。上述代码是不可以通过编译的。
    但是如果这样:
#include <iostream>
using namespace std;
int* f()
{
        int arr[2][3] = {{1,2,3}, {7,8,9}},**p;
        p=&(arr[0]);//编译器报错,同样是指向二维指针啊。
        return arr[0];
}

int main()
{
        int **p;
        p=&(f());//这里是有错的。
        cout << **p<< endl;
        system("pause");
        return 0;
}
编译是无法通过的,这是为什么呢?

[[italic] 本帖最后由 VanHorn 于 2008-1-10 17:12 编辑 [/italic]]
2008-01-10 09:37
快速回复:C++中函数怎么返回一个二维数组。指针怎么指向二维数组?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018550 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved