免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 白水月
打印 上一主题 下一主题

关于二维数组 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-04-09 21:11 |只看该作者
原帖由 zwylinux 于 2007-4-9 19:18 发表
the following function get_matrix_space generates a m*n matrix, and then return the address of the matrix

double **get_matrix_space(int m, int n){
  int i;
  double **a;
  
  a = calloc(m,si ...


这样当然可以,因为你的数组长度由m , n决定了

但是没有办法返回一个通用的二维数组。比如,你在一个函数中动态分配了一个二维数组(执行这个函数之前是不知道这个二维数组中每一维的长度的,长度根据传入的参数或者其他条件而定,总之不是固定的),然后函数结束的时候要求返回一个二维数组。这个我觉得就没有办法办到。因为,函数只能够返回基础数据类型(比如int, double)和指针,所以调用这个函数的程序,是没有办法获知这个二维数组的中每一维的数组的长度的。除非你利用全局变量记录,否则没有办法获知。

以上是我的一些想法,如有不对,望拍砖~~~
互相探讨参能进步~

[ 本帖最后由 janusle 于 2007-4-9 21:13 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-04-09 22:12 |只看该作者
按照楼上这样说,是不是不能返回一个一维数组了呢?因为你返回这个数组的首地址时也是不能知道这个数组的大小的。
    其实无论对于一维或二维数组,你通过调用函数后返回时是返回数组的首地址,数组长度通常是通过其他方式来限定的。

论坛徽章:
0
13 [报告]
发表于 2007-04-10 09:15 |只看该作者
我觉得数组传递只能传递地址,返回的也是数组首地址,如果要传递整个数组就只能把这个数组写进结构体,因为结构体可以做传值传递,这样相当与传整个数组,不知可否??

论坛徽章:
0
14 [报告]
发表于 2007-04-10 12:35 |只看该作者
原帖由 F.D.Roosevelt 于 2007-4-9 20:05 发表


有啊, 咋会没呢, 十维都有

说明你对数组不了解

论坛徽章:
0
15 [报告]
发表于 2007-04-10 14:34 |只看该作者
不可以定义成
int (*p)[m]   ?

论坛徽章:
0
16 [报告]
发表于 2007-04-10 14:36 |只看该作者
原帖由 janusle 于 2007-4-9 21:11 发表


这样当然可以,因为你的数组长度由m , n决定了

但是没有办法返回一个通用的二维数组。比如,你在一个函数中动态分配了一个二维数组(执行这个函数之前是不知道这个二维数组中每一维的长度的,长度根据传入 ...




我同意你的说法

论坛徽章:
0
17 [报告]
发表于 2007-04-10 23:10 |只看该作者
>> 请问如何返回一个二维数组?

在 C 语言中,return 一个非 void 类型的表达式其实是一种传值的方式。

数组是一种特殊的数据类型,对数组对象进行求值得到的是指向第一个元素的指针,所以对于数组有一些操作上的限制,例如不能直接进行拷贝(数组只能逐个元素或者逐个字节进行拷贝),不能对数组赋值(因为数组对象已经转换为一个指针值),等等。

因此,函数的返回值类型不能是数组类型。

对于数组的操作,其实都是通过指向其元素的指针来进行的(即使使用的是数组名,其实数组名一般也是作为指针来使用的)。

了解了以上两点,你应该放弃让函数返回一个数组类型的想法,可能你需要返回的是一个指针。

第二个问题:

  1. int*  get( int a[5][5] )
  2. {
  3.       return a[0]; // 还可以是:a[1], a[2], &a[3][4], ...
  4. }

  5. 或者

  6. typedef int (*PA5)[5];

  7. PA5
  8. get( int a[5][5] )
  9. {
  10.   return a; // 还可以是:a+1, a+2, ...
  11. }
复制代码

至于到底返回什么,取决于你的需要。

>> 不可以定义成 int (*p)[m]   ?

可以,但是函数的返回类型不能直接写为这样的类型,必须象上面那样借助于 typedef 来实现。这可能是为数不多的 typedef 不可或缺的地方。

论坛徽章:
0
18 [报告]
发表于 2007-04-10 23:22 |只看该作者

回复 17楼 whyglinux 的帖子

可以,但是函数的返回类型不能直接写为这样的类型,必须象上面那样借助于 typedef 来实现。这可能是为数不多的 typedef 不可或缺的地方。

可以这样(有点不好看罢了,还是用typedef好理解点):

  1. char (*func(char (*a)[5]))[5]
  2. {
  3.       return a;
  4. }
复制代码

论坛徽章:
0
19 [报告]
发表于 2007-04-10 23:44 |只看该作者
>> 可以,但是函数的返回类型不能直接写为这样的类型,必须象上面那样借助于 typedef 来实现。这可能是为数不多的 typedef 不可或缺的地方。

根据前面 tyc611 的解答,上面这句话自动失效,特此声明。

再次谢谢 tyc611。也希望论坛上出现更多的如 tyc611 这样头脑清晰、眼光敏锐的人,如此幸甚。

论坛徽章:
0
20 [报告]
发表于 2007-04-10 23:49 |只看该作者
原帖由 whyglinux 于 2007-4-10 23:44 发表
>> 可以,但是函数的返回类型不能直接写为这样的类型,必须象上面那样借助于 typedef 来实现。这可能是为数不多的 typedef 不可或缺的地方。

根据前面 tyc611 的解答,上面这句话自动失效,特此声明。
...

版主你可别这样说,你可是我在这坛子心中的偶像啊
PS:好久不见你了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP