c语言数组及强制转换

问题:

已分配了一指向线性或1维整形的指针,如:ptr = (int *)malloc(ARRARY_SIZE)。

以后在程序中,一个函数将把这个数组看做100*200的2维数组。


函数说明为:

void func(int array[][200]);

 

如何把取自malloc的指针传递给这个函数,并让所有c编译器通过呢?这就需要强制转换(cast)操作。


构造方式:

func((int( *)[200])foo); (注意:foo是指向由malloc分配的指针,下面不再说明了。)

 

这是最终的正确答案。

===============================================================================================

在这里有个大的前提,数组和由malloc分配的数据块都是有一定共性的。

共性:就是都是连续的内存块。(这个概念应该在我们的脑子里有一个前提。)

现在来看:

a[0];

a[0][0];

a[0][0][0];

*a[0]将取回与a[0][0]同样的值。(呵呵)

...

这里是不是也有一个特性,他们的首地址都是第一个地址,也就是数组名,也就是所有不论n维数组的第一个元素都是一个块的开始。

(看起来简单,但是确实一个重要的概念。)

那么,由malloc分配的,ptr指向的也是一个开始地址。(呵呵。不是太严密,但是是这个意思)

那吗好,这里到此为止。我们继续分析。

================================================================================================

那么为什么要这样构造呢?

里面却是有深层次的原因,让我们来一步一步的分析。

(int( *)[200])foo;(这明显是一个强制转换的操作。看起来像是1维数组?)

int说明是整形,( *)说明是指针,[200]说明是列为200的数组。问题来了,那么行呢?这里行是一个不确定的因素。

(注意:大家都知道c语言的数组定义是要指定数组个数的!)那么为什么上面的定义只有列数而没有行数呢?

c编译器是如何“看见”2维数组的呢?

数组只是内存位置的连续集合,但编译器懂得数组成员是通过两个索引访问的。于是,为了引用数组元素,编译器需要知道数组的维。而且,给数组分配空间,编译器的确要知道2个维(也包括数据类型)。但要引用数组的一项,编译器只需要知道数组中有多少列。

例如:考虑一下[2][3]大小的字节数组。元素[i][j]偏移的计算就是i*3+j。编译器不需要第1下标的大小。

因此,人们能够操作无法预先知道大小的2维数组。

在写array[i][j]的地方,可简单写成*(&array[0][0] + i*COLS +j);(COLS代表列数,表达式&array[0][0]返回数组首元地址)

 

                                       |-------------------->( *)他是“指针”

                              (int( *)[200])foo

-“数组的指针”左看-|-右看“整型数组的指针”

下面是我参考的文章的下载地址。文章写的有些罗嗦。所以在这里总结一下。但是还是比较罗嗦。呵呵,请参看:http://blog.csdn.net/annhoo/article/details/6656081

http://download.csdn.net/source/3490809

 

回头有时间写个经典的。就这样,呵呵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值