打印
[ZLG-ARM]

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

[复制链接]
1971|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
anzhiguo|  楼主 | 2007-5-31 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在c语言中定义一个变量为一维数组,可以把它当作2维的引用吗 ?如下:
extern unsigned int (*frameBuffer1)[SCR_XSIZE/32];
frameBuffer1[(y)][(x)/32]=( frameBuffer1[(y)][(x)/32] & ~(0x80000000>>((x)%32)*1) )
            | ( (c)<< ((32-1-((x)%32))*1) );
程序是一个开发板提供的源程序,编译可以通过。

相关帖子

沙发
王紫豪| | 2007-5-31 21:10 | 只看该作者

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

使用特权

评论回复
板凳
平常人| | 2007-5-31 21:18 | 只看该作者

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

楼主自己是不是也要到处找答案呢?

使用特权

评论回复
地板
mohanwei| | 2007-5-31 22:19 | 只看该作者

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

而且这样做还有一个很大的优点:数据是连续的,容易传输、存储。

使用特权

评论回复
5
linjing| | 2007-5-31 23:16 | 只看该作者

在c语言中定义一个变量为一维数组,可以把它当作2维的引用吗?这个答案是肯定的,不过本人通常的做法是定义成二维数组,然后强制转制成一维数组引用。

你给出的例子可不是二维数组,而是一维指针数组,即数组本身是一维数组,数组中的每个元素是一个指针,指向一维int 数组

使用特权

评论回复
6
Ice_River| | 2007-6-1 10:23 | 只看该作者

linjing

"定义成二维数组,然后强制转制成一维数组"?
不太明白 能否指教下!

使用特权

评论回复
7
mohanwei| | 2007-6-1 21:30 | 只看该作者

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

因为多维数组的数据可能不是连续存放的。

使用特权

评论回复
8
平常人| | 2007-6-1 21:38 | 只看该作者

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

使用特权

评论回复
9
quben| | 2007-6-2 15:58 | 只看该作者

一维数组作二维数组用

extern unsigned int (*frameBuffer1)[SCR_XSIZE/32];

应该是只定义了一个指针,该指针指向有“SCR_XSIZE/32”个整型数的一维数组

使用特权

评论回复
10
mohanwei| | 2007-6-2 21:30 | 只看该作者

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

只有最后一个下标指向数据;倒数第二个下标是指针;倒数第三个下标是指向指针的指针;倒数第四个下标是指向(指向指针的指针)……依此类推。所以多维数组会需要占用额外的存储单元!

在VC里,二维数组的典型分配方法如下:
//Allocate:
int **p = new int* [m];
for(int i = 0 ; i < m ; i++)
{
    p = new int[n];
}
//Use:
for(int i = 0 ; i < m; i++)
{
    for(int j = 0 ; j < n ; j++)
    {
        p[j] = i * j;
    }
}

使用特权

评论回复
11
平常人| | 2007-6-2 21:58 | 只看该作者

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

试试直接静态地分配多维数组就不会有这种“指针的指针的指针”的情况了。

其实在VC里我也很少用new,因为严格地说使用new时,每次需要检测返回的指针是否为空,这样很麻烦;如不检测一般小程序不会有问题,但保不准那天出问题,所以我还是喜欢用静态的分配方法。

使用特权

评论回复
12
mohanwei| | 2007-6-2 22:32 | 只看该作者

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

实际使用中绝大部分都是动态分配的。你定义一个类、创建一个对话框……无不涉及到海量的new……只不过这些内存分配代码被封装到类里了而已^_^

使用特权

评论回复
13
mohanwei| | 2007-6-3 21:18 | 只看该作者

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

按引用传递,也就是说你把它传递给一个函数以后,就不能通过“Array[j][k]”这种形式使用了——而真正的多维数组可以。

使用特权

评论回复
14
simon21ic| | 2007-6-4 17:26 | 只看该作者

如下不成立

unsigned int (*frameBuffer1)[SCR_XSIZE/32];这个定义的并不是一维数组,而是一个指向一维数组的指针.之后就不难理解了.

使用特权

评论回复
15
linjing| | 2007-6-7 19:58 | 只看该作者

回 mohanwei

int array[10][10];

int sub( int array[], int index ){
    return array[index];
}

int main( void ){
   int a23 = sub((int*)array, 2*10+3 ); // 把二维数组当一维数组用,甚至可以不强制类型转换,但编译时报Warning
   printf("array[%d][%d] = %d", 2, 3, a23 );
}

"多维数组的数据可能不是连续存放的"这句话我不明白你想表达什么意思,C语言数组是行主序的, 这是确定的,有时自己计算行列地址可能会更方便些

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

1

粉丝