|
发表于 2002-11-18 23:22:53
|
显示全部楼层
可以给出一个例子,这个例子将建立一个从1到10的一次方至四次方的表格。
#include <malloc.h>
/* display powers of numbers */
int main()
{
int *p;
p=(int *)malloc(40*sizeof(int));
if(!P) {
printf("memory request failed\n");
exit(1);
}
/* here, p is simply a pointer */
table(p);
show(p);
}
table(p)
int p[4][10];/* now the compiler thinks that p is an array */
{
register int i,j;
for(j=1;j<11;j++)
for(i=1;i<5;i++) p[j]=pwr(j,i);
}
show(p)
int p[4][10];
{
register int i,j;
printf("%10s %10s %10s %10s\n","N","N^2","N^3","N^4");
for(j=1;j<11;j++) {
for(i=1;i<5;i++) printf("%10d ",p[j]);
printf("\n");
}
}
pwr(a,b)
int a,b;
{
register int t=1;
for(;b;b--) t=t*a;
return t;
}
正如这个程序显示的那样,将函数定义为所需大小的数组,即可“哄骗”C编译程序处理多维动态数组。对C编译程序而言,在函数show()和table()中确实有一个大小为4X10的数组。不同的是,数组的存储空间是由语句malloc()分配的,而不是通过一般的数组说明语句自动地得到固定大小的存储空间。但这种方法也有明显的缺点,由于不可能在编译时对数组进行检查,很容易在运行时造成数组下标越界或指针访问非法地址。如果你学过数据结构,可以采用链表来解决这个问题。你可以设计一个LNode 结构,如下所示:
struct LNode /* 定义单链表结点 */
{
ElemType data; /* 数组元素 */
int x; /* 数组的第一维下标 */
int y; /* 数组的第二维下标 */
struct LNode *next /* 指向下一个结点的指针 */
}
这样把数组的下标变成链表结点结构的成员,在新增结点时只管插入就行了,完全不受数组大小的限制。只是编程要麻烦一些。 |
|