如何将二维数组作为函数的参数传递

如何将二维数组作为函数的参数传递作者: jatix邮箱: jatix@163.comQQ: 52287017声明: 如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批评以及指正,我将很乐意地接受。*_*概述: 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。正文: 首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): [原文开始] 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void Func(int array[][10]); 二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的: void Func(int array[][]); 因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维,下面写法是错误的: void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为: void Func(int array[3][10]); 而形参数组定义为: int array[5][10]; 这时形参数组只取实参数组的一部分,其余部分不起作用。 [原文结束] 大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的: 对于数组 int p[m][n]; 如果要取p[i][j]的值(i> =0 && i int main(){int i = 0, v = 0;float AdjoinMatrix[5][5]={{0, 10,NO_PATH,30,100},{NO_PATH,0,50,NO_PATH,NO_PATH},{NO_PATH,NO_PATH,0,NO_PATH,10},{NO_PATH,NO_PATH,20,0,60},{NO_PATH,NO_PATH,NO_PATH,NO_PATH,0}};int Path[5];float Length[5];ShortestPath(AdjoinMatrix, Length, Path, 5, 0);for(i = 1; i < 5; i++){v = i;while(v != 0){printf( "%d ", v);v = Path[v];}printf( "%d\n ", v);}return 0;} // // ShortestPath.h 中定义了求一个图中某个顶点到其他顶点的最短路经的函数,还定义了一个 // 宏,#define NO_PATH 0x00ffffff,如果图中的两个顶点之间的直接路径的长度为NO_PATH, // 表示图中两个顶点是不直接相通的。 //#ifndef INCLUDE_SHORTESTPATH_H#define INCLUDE_SHORTESTPATH_H#define IN#define OUT#define NO_PATH 0x00ffffff/*++Abstract: 该函数的功能是求得一个图中的某个顶点到其他所有顶点的最短路经,及其最短路经的长度 Returen value: 类型是int,含义如下 0 成功 1 资源不够 Examples: //你有一个图的邻接矩阵如AdjoinMatrix[n][n]和数组Path[n], Length[n](n为图顶点的个数, //然后你可以如下调用:ShortestPath(AdjoinMatrix, Length, Path, 5, 0); //调用后,Path[n]中存放最短路径,Length[n]中存放着最短路径的长度 //下面的例子中我们求得从0顶点到其他定点的最短路经及其长度 float AdjoinMatrix[5][5]={{0, 10,NO_PATH,30,100},{NO_PATH,0,50,NO_PATH,NO_PATH},{NO_PATH,NO_PATH,0,NO_PATH,10},{NO_PATH,NO_PATH,20,0,60},{NO_PATH,NO_PATH,NO_PATH,NO_PATH,0}};int Path[5];float Length[5]; ShortestPath(AdjoinMatrix, Length, Path, 5, 0); int i = 0, int v =0;for(i = 1; i < 5; i++){v = i;while(v != 0){printf( "%d ", v);v = Path[v];}printf( "%d\n ", v);}--*/int ShortestPath(IN float **AdjoinMatrix, //存放图的邻接矩阵,是一个二维数组OUT float *Length, //用于返回到各个点的最短路经的长度OUT int *Path, //用于返回最短路经,Path[i]表示在最短路经上顶点i前面的顶点IN int VertexNum, //顶点的个数IN int Vertex //起始顶点);#endif // // ShortestPath.c 中实现了求一个图中某个顶点到其他顶点的最短路经的函数。 //#include "ShortestPath.h "#include /*++Abstract:该函数的功能是求得一个图中的某个顶点到其他所有顶点的最短路经,及其最短路经的长度Returen value:类型是int,含义如下0 成功1 资源不够--*/int ShortestPath(IN float **AdjoinMatrix, //存放图的邻接矩阵,是一个二维数组OUT float *Length, //用于返回到各个点的最短路经的长度OUT int *Path, //用于返回最短路经,Path[i]表示在最短路经上顶点i前面的顶点IN int VertexNum, //顶点的个数IN int Vertex //起始顶点){int i = 0, j = 0, w = 0; 已经在最短路经中的点的集合,如果VertexSet[i]不为0,则表示第i个点在该集合中//int *VertexSet = (int*)malloc(VertexNum);if(VertexSet == NULL){return 1; //缺乏内存资源} 初始化//for(i = 0; i < VertexNum; i++){Length[i] = *((float*)AdjoinMatrix + Vertex*VertexNum + i);VertexSet[i]=0;if(i != Vertex && Length[i] < NO_PATH){Path[i]=Vertex;}else{Path[i] = -1;}}VertexSet[Vertex] = 1;Length[Vertex] = 0; 求得最短路经//for(i = 0; i < VertexNum-1; i++){float min = NO_PATH;int u = Vertex;for(j = 0; j < VertexNum; j++){if( !VertexSet[j] && Length[j] < min){u = j;min = Length[j];}}VertexSet[u] = 1;for(w = 0; w < VertexNum; w++){if(!VertexSet[w] && *((float*)AdjoinMatrix + u*VertexNum + w) < NO_PATH && Length[u]+*((float*)AdjoinMatrix + u*VertexNum + w) < Length[w]){Length[w] = Length[u] + *((float*)AdjoinMatrix + u*VertexNum + w);Path[w] = u;}}}return 0;} http://topic.csdn.net/t/20040828/23/3319216.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值