c语言数组可以强制转换,C语言数组访问及强制转换

c语言系列工具书

第2l卷第4期

2001年12月惠州大学学报(自然科学版)Journal0fHuizIlouu证versity(Nat.Sci.)V01.21.No.4Dec.2001

C语言数组访问及强制转换

季军杰

(惠州大学电子工程系惠州516015)胡小军(惠州市信息中心惠州516001)

摘要本文通过一个编程实例解析了C语言中数组访问机制及强制转换操作。

文献标识码:A文章编号:1007—6107(2001)04—0037—03关键词数组;指针;强制转换中图分类号:7rP313

这是一个特殊的C编程问题,曾涉及过动态数组分配的程序员很可能碰到过,问题是这样:已分配了一指向线性或1维整型数组的指针,如:ptr=(int*)malloc(ARRAYSIZE)。以后在程序中,一个函数将把这个数组看作100×200的2维数组。这个函数说明为:void劬cl(int唧ay[][200])。如何把取自mal】oc()的指针传给这个函数并让所有C编译器通过呢?这就需要强制转换(cast)操作。如何构造呢?答案是:funcl((int(*)[200])‰);这是最终的正确答案。这种解决方案虽不是那么显而易见,因其强制转换操作中嵌套的元素太多,但上述强制转换行得通,因为如ncl()能处理由指针指向的有200个整数的数组。

表面上看,这似乎错了。funcl处理一指针指向的2维整型数组,而不是一个有200个整数的1维数组。现在,我们要弄清C是如何看待数组的以及如何解释强制转换操作。

在一些应用中,常常需要变数数组。即,虽然funcl()对单个100x200整型数组操作,但其调用者要为3个或4个这样的数组分配空间。

分配当然通过malloc()产生。由‰c1()的调用者确定2维数组缓冲区的偏移,并把指针传给funcl()。于是问题来了:要把指向整数(确切地讲,是整数的一连续缓冲区)的指针强行指向能处理2维整型数组的函数。

人们能传递指针来代替引用1维数组。例如,把ptr(前已定义)传给如下定义的函数:voidfuncl(intarray[]);

这个答案是不对的。funcl()要对2维数组进行操作且不是所有的编译器都能通过。

这有一个相关问题,它的解决方案导致了最初问题的解决。相关问题是这样:程序员如收稿日期:2001一04一10

作者简介:季军杰(1967一),男,江苏泰兴人,惠州大学电子工程系工程师万方数据