[ZLG-ARM] 郁闷!刚在另一帖中回答了同样问题,**楼主一贴多发!

[复制链接]
3018|14
 楼主| anzhiguo 发表于 2007-5-31 16:52 | 显示全部楼层 |阅读模式
在c语言中定义一个变量为一维数组,可以把它当作2维的引用吗&nbsp;?如下:<br />extern&nbsp;unsigned&nbsp;int&nbsp;(*frameBuffer1)[SCR_XSIZE/32];<br />frameBuffer1[(y)][(x)/32]=(&nbsp;frameBuffer1[(y)][(x)/32]&nbsp;&&nbsp;~(0x80000000&gt&gt((x)%32)*1)&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;(&nbsp;(c)&lt&lt&nbsp;((32-1-((x)%32))*1)&nbsp;);<br />程序是一个开发板提供的源程序,编译可以通过。
王紫豪 发表于 2007-5-31 21:10 | 显示全部楼层

楼主首先弄清楚指针、数组之间的关系,就明白了!

  
平常人 发表于 2007-5-31 21:18 | 显示全部楼层

郁闷!刚在另一帖中回答了同样问题,**楼主一贴多发!

楼主自己是不是也要到处找答案呢?
mohanwei 发表于 2007-5-31 22:19 | 显示全部楼层

不是同一个东西,但是可以这么用。

而且这样做还有一个很大的优点:数据是连续的,容易传输、存储。
linjing 发表于 2007-5-31 23:16 | 显示全部楼层

在c语言中定义一个变量为一维数组,可以把它当作2维的引用吗?这个答案是肯定的,不过本人通常的做法是定义成二维数组,然后强制转制成一维数组引用。<br /><br />你给出的例子可不是二维数组,而是一维指针数组,即数组本身是一维数组,数组中的每个元素是一个指针,指向一维int&nbsp;数组
Ice_River 发表于 2007-6-1 10:23 | 显示全部楼层

linjing

&quot;定义成二维数组,然后强制转制成一维数组&quot;?<br />不太明白&nbsp;能否指教下!<br />
mohanwei 发表于 2007-6-1 21:30 | 显示全部楼层

一维可以当二维、三维……N维用;但是反过来是不行的!

因为多维数组的数据可能不是连续存放的。
平常人 发表于 2007-6-1 21:38 | 显示全部楼层

7楼能说说为什么多维数组的数据可能不是连续存放的?

  
quben 发表于 2007-6-2 15:58 | 显示全部楼层

一维数组作二维数组用

extern&nbsp;unsigned&nbsp;int&nbsp;(*frameBuffer1)[SCR_XSIZE/32];<br /><br />应该是只定义了一个指针,该指针指向有“SCR_XSIZE/32”个整型数的一维数组<br />
mohanwei 发表于 2007-6-2 21:30 | 显示全部楼层

to 8楼:多维数组Array[k0][k1]……[kn]里

只有最后一个下标指向数据;倒数第二个下标是指针;倒数第三个下标是指向指针的指针;倒数第四个下标是指向(指向指针的指针)……依此类推。所以多维数组会需要占用额外的存储单元!<br /><br />在VC里,二维数组的典型分配方法如下:<br />//Allocate:<br />int&nbsp;**p&nbsp;=&nbsp;new&nbsp;int*&nbsp;[m];<br />for(int&nbsp;i&nbsp;=&nbsp;0&nbsp;;&nbsp;i&nbsp;&lt&nbsp;m&nbsp;;&nbsp;i++)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;new&nbsp;int[n];<br />}<br />//Use:<br />for(int&nbsp;i&nbsp;=&nbsp;0&nbsp;;&nbsp;i&nbsp;&lt&nbsp;m;&nbsp;i++)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;j&nbsp;=&nbsp;0&nbsp;;&nbsp;j&nbsp;&lt&nbsp;n&nbsp;;&nbsp;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p[j]&nbsp;=&nbsp;i&nbsp;*&nbsp;j;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}
平常人 发表于 2007-6-2 21:58 | 显示全部楼层

你用这种new的方法当然会搞出一大堆指针了

试试直接静态地分配多维数组就不会有这种“指针的指针的指针”的情况了。<br /><br />其实在VC里我也很少用new,因为严格地说使用new时,每次需要检测返回的指针是否为空,这样很麻烦;如不检测一般小程序不会有问题,但保不准那天出问题,所以我还是喜欢用静态的分配方法。
mohanwei 发表于 2007-6-2 22:32 | 显示全部楼层

书本上讲静态分配的多,静态分配是一种特殊的情况。

实际使用中绝大部分都是动态分配的。你定义一个类、创建一个对话框……无不涉及到海量的new……只不过这些内存分配代码被封装到类里了而已^_^
mohanwei 发表于 2007-6-3 21:18 | 显示全部楼层

还有很严重的一点:静态多维数组本质上是一维的,所以不

按引用传递,也就是说你把它传递给一个函数以后,就不能通过“Array[j][k]”这种形式使用了——而真正的多维数组可以。
simon21ic 发表于 2007-6-4 17:26 | 显示全部楼层

如下不成立

unsigned&nbsp;int&nbsp;(*frameBuffer1)[SCR_XSIZE/32];这个定义的并不是一维数组,而是一个指向一维数组的指针.之后就不难理解了.
linjing 发表于 2007-6-7 19:58 | 显示全部楼层

回 mohanwei

int&nbsp;array[10][10];<br /><br />int&nbsp;sub(&nbsp;int&nbsp;array[],&nbsp;int&nbsp;index&nbsp;){<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;array[index];<br />}<br /><br />int&nbsp;main(&nbsp;void&nbsp;){<br />&nbsp;&nbsp;&nbsp;int&nbsp;a23&nbsp;=&nbsp;sub((int*)array,&nbsp;2*10+3&nbsp;);&nbsp;//&nbsp;把二维数组当一维数组用,甚至可以不强制类型转换,但编译时报Warning<br />&nbsp;&nbsp;&nbsp;printf(&quot;array[%d][%d]&nbsp;=&nbsp;%d&quot;,&nbsp;2,&nbsp;3,&nbsp;a23&nbsp;);<br />}<br /><br />&quot;多维数组的数据可能不是连续存放的&quot;这句话我不明白你想表达什么意思,C语言数组是行主序的,&nbsp;这是确定的,有时自己计算行列地址可能会更方便些
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部