关键词不能为空

当前您在: 主页 > 高中公式大全 >

awkwardly:关于多维数组做参数的函数使用

作者:高考题库网
来源:https://www.bjmy2z.cn/gaokao
2020-11-22 12:04
tags:数组公式怎么用

桃花源记中的词类活用-关于文学的作文

2020年11月22日发(作者:都冰如)
[原文开始]
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可
以指
定所有维数的大小,也可以省略第一维的大小说明,如:
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它的
地址为:
p + i*n + j;
从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如
何正确
的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作
为参数,
这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,
但是我们
完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上
两个参数
指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函
数的参数
传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,
例如:
void Func(int array[3][10]);
void Func(int array[][10]);
变为:
void Func(int **array, int m, int n);
在转变后的函数中,array[i][j]这样 的式子是不对的(不信,大家可以试一下),
因为
编译器不能正确的为它寻址,所以我们需要 模仿编译器的行为把array[i][j]这
样的式子
手工转变为
*((int*)array + n*i + j);
在调用这样的函数的时候,需要注意一下,如下面的例子:
int a[3][3] =
{
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
Func(a, 3, 3);
根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换
如下调用

Func((int**)a, 3, 3);
其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不
再赘述
。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个
完整的例
子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路
经,图是以
邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但
是我们这
篇文章的重点在于将二维数组作为函数的参数传递。
完整的例子程序包括三个文件,在Microsoft Visual C++ 6.0下调试通过。如
下:

mian.c 为主程序入口,并且调用了示范了如何调用求一个图中某个顶点到其
他顶点
的最短路经
的函数

#include
#include

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(
v = Path[v];
}
printf(
}
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(
v = Path[v];
}
printf(
}

--*

int ShortestPath(
IN float **AdjoinMatrix, 存放图的邻接矩阵,是
一个二维数组
OUT float *Length, 用于返回到各
个点的最短路经的长度
OUT int *Path, 用于返回最短
路经,Path[i]表示在最短路经上顶点i前面的顶点
IN int VertexNum, 顶点的个数
IN int Vertex 起始顶点
);
#endif


ShortestPath.c 中实现了求一个图中某个顶点到其他顶点的最短路经的函
数。


#include

#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;
}

一怎么读-fe是什么元素


新闻的三个特点-王之涣


室内设计行业真难混-就远原则的短语


如何聊天找话题-早教教什么


始得西山宴游记原文及翻译-宣传工作计划


表达英文-新疆最近新闻


全世界有多少个国家-电子商务就业方向


国际贸易管理-bamboo



本文更新与2020-11-22 12:04,由作者提供,不代表本网站立场,转载请注明出处:https://www.bjmy2z.cn/gaokao/454951.html

关于多维数组做参数的函数使用的相关文章

  • 余华爱情经典语录,余华爱情句子

    余华的经典语录——余华《第七天》40、我不怕死,一点都不怕,只怕再也不能看见你——余华《第七天》4可是我再也没遇到一个像福贵这样令我难忘的人了,对自己的经历如此清楚,

    语文
  • 心情低落的图片压抑,心情低落的图片发朋友圈

    心情压抑的图片(心太累没人理解的说说带图片)1、有时候很想找个人倾诉一下,却又不知从何说起,最终是什么也不说,只想快点睡过去,告诉自己,明天就好了。有时候,突然会觉得

    语文
  • 经典古训100句图片大全,古训名言警句

    古代经典励志名言100句译:好的药物味苦但对治病有利;忠言劝诫的话听起来不顺耳却对人的行为有利。3良言一句三冬暖,恶语伤人六月寒。喷泉的高度不会超过它的源头;一个人的事

    语文
  • 关于青春奋斗的名人名言鲁迅,关于青年奋斗的名言鲁迅

    鲁迅名言名句大全励志1、世上本没有路,走的人多了自然便成了路。下面是我整理的鲁迅先生的名言名句大全,希望对你有所帮助!当生存时,还是将遭践踏,将遭删刈,直至于死亡而

    语文
  • 三国群英单机版手游礼包码,三国群英手机单机版攻略

    三国群英传7五神兽洞有什么用那是多一个武将技能。青龙飞升召唤出东方的守护兽,神兽之一的青龙。玄武怒流召唤出北方的守护兽,神兽之一的玄武。白虎傲啸召唤出西方的守护兽,

    语文
  • 不收费的情感挽回专家电话,情感挽回免费咨询

    免费的情感挽回机构(揭秘情感挽回机构骗局)1、牛牛(化名)向上海市公安局金山分局报案,称自己为了挽回与女友的感情,被一家名为“实花教育咨询”的情感咨询机构诈骗4万余元。

    语文