问答1 问答5 问答50 问答500 问答1000
网友互助专业问答平台

c语言中怎么用二维数组作为函数参数436

提问网友 发布时间:2023-10-28 07:31
声明:本网页内容为用户发布,旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:1656858193@qq.com
5个回答
热心网友 回答时间:2024-05-16 18:39

二维数组作为函数参数,实参可以直接使用二维数组名,在被调用函数中对形参数组定义可以指定所有维数的大小,也可以省略第一维的大小说明,如:

它们是合法且等价,也可以使用如下形式:

但不能省略第二维的大小,如下面的定义是不合法的,编译时会出错:

因为从实参传递来的是数组的起始地址,如果在形参中不说明列数,编译器将无法定位元素的的位置。

热心网友 回答时间:2024-05-16 18:39
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:

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<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:

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);

其实*数组和二维数组原理是一样的,大家可以自己扩充的*数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一 个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数 也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。
热心网友 回答时间:2024-05-16 18:39
很简单的,数组作为函数参数传递的时候只要是数组名就可以了,因为数组名本身就是数组的首地址 .给个程序看看

#include<stdio.h>
#define N 3
int array[N][N];
void main()
{
//在主函数内声明被调函数
void convert(int array[][3]);
int i,j;
printf("输入数组:\n");
for(j=0;j<N;j++)
for(i=0;i<N;i++)
scanf("%d",&array[i][j]);
printf("\n");
for(j=0;j<N;j++)
{
for(i=0;i<N;i++)
printf("%d\t",array[i][j]);
printf("\n");
}
//调用矩阵转置函数
convert(array);
printf("\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%d\t",array[i][j]);
printf("\n");
}
}
void convert(int array[][3])
{
int i,j,t;
for(i=0;i<N;i++)
for(j=0;j<N;j++)//设置数组中转置矩阵元素交换
{
t=array[i][j];
array[i][j]=array[j][i];
array[j][i]=t;
}
}
热心网友 回答时间:2024-05-16 18:40
直接就写数组的名称就可以了,比如你定义的数组是a[4][3],在实参中填a就可以,在型参中定义一个二维数组或一个指针变量就可以让二维数组的值在函数中使用了!
热心网友 回答时间:2024-05-16 18:41
可以用指针的形式表示,或者用二维数组显示表示

本文如未解决您的问题请添加抖音号:51dongshi(抖音搜索懂视),直接咨询即可。

什么办法?填动词。3 填空什么红锈?填动词。 什么天气填空动词111 什么源流填动词?1 什么一团填空动词? 白葡萄球菌在固体培养基上的生长表现是什么? 诺基亚手机在ovi商店安装的程序如何删除? 美团送外卖怎么样?新手去送外卖?在线等,在找工作呢?想存点钱...25 ...上了以前的女友,她也结婚了,每天满脑子都是她,我和她又无话不谈... 14年长安奔奔怎么学习遥控器1 长安奔奔怎么匹配钥匙11 长安奔奔mi遥控器怎么匹配60 智能家居有什么弊端缺点19 微信转账失败图片制作方法 液压系统由哪些元件组成8 液压传动系统有哪几个部分组成?各起什么作用?每个的液压元件是...4 液压与气压传动系统主要由什么组成39 第四军医大生物医学工程专业毕业后会分配到边远地区么?4 C语言编‘写用二维数组判断五个坐标是否在同一直线上’2 C语言中如何产生随机的二维数组的坐标10 生物医学工程专业偏医学方向的大学有哪些? 在重庆能买新世纪的提货卡么,是马上买了马上就能拿到么?1 可以通过地图看公交位置这是信息社会的什么体现 智能家居真的提升生活的幸福感吗?4 电影,科幻,智能家居,生活,未来,想象,希望,多么 艺术类成语的类别有哪些?1 有涉及智能家居空间的国外电影8 最强大脑3月6号中德对抗赛谁赢了1 欧马柴油机25马力多少钱3 四川福峰农业有限责任公司怎么样? OVI商店图标删除了怎么恢复 碳酸和硫化氢哪个酸性强? ...股票上市以来的最高股价是多少?华西能源股票价格历史行情?华西能源... 欧马单缸柴油机1115多大马力5 单缸柴油机缸盖上的孔都起什么作用3 四川省振昊农业有限责任公司怎么样? 江淮32单缸柴油机,汽缸盖油头处渗水要不要事 单缸柴油机缸盖下渗水怎么回事1 已婚女人专为另一个男人开一个感情到什么情况? ...A2D7-08002B30309D}结果变成网上邻居然后打不开了
Top