扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
C语言中
我们一直强调成都做网站、网站建设对于企业的重要性,如果您也觉得重要,那么就需要我们慎重对待,选择一个安全靠谱的网站建设公司,企业网站我们建议是要么不做,要么就做好,让网站能真正成为企业发展过程中的有力推手。专业网络公司不一定是大公司,成都创新互联作为专业的网络公司选择我们就是放心。
指针做函数参数传递二维数组有两种基本方法:1、传递“数组指针”pre
t="code"
l="cpp"#include
stdio.h
void
output(
int
(*pa)[3],
int
n
)//这个函数只能输出n行3列的二维数组
{
int
i,j;
for(
i=0;in;i++
){
for(
j=0;j3;j++
)
printf("%d
",
pa[i][j]
);
printf("\n");
}
}
void
main()
{
int
a[2][3]={
{1,2,3},
{4,5,6}
};
output(a,2);
}2、传递“指针数组”
先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去。pre
t="code"
l="cpp"#include
stdio.h
void
output(
int
*pa[],
int
row,int
col
)
//这个函数更通用,但调用前,要做好准备工作。
{
int
i,j;
for(
i=0;irow;i++
){
for(
j=0;jcol;j++
)
printf("%d
",
pa[i][j]
);
printf("\n");
}
}
void
main()
{
int
a[2][3]={
{1,2,3},
{4,5,6}
};
int
i;
int
*pa[2];
for(
i=0;i2;i++
)
pa[i]=a[i];
output(pa,
2,
3);
}
对的,是我的第二种方法。
1.可以用指针。
void
Func(int
**array,
int
m,
int
n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
*((int*)array
+
n*i
+
j);
2.可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如:
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];
这时形参数组只取实参数组的一部分,其余部分不起作用。
二维数组无法作为参数直接传递给函数,但是可以利用二维数组内部数据的连续性,将二维数组的地址按照一维数组的方式传递给函数,并传入对应的行列数,从而实现函数内打印二维数组的效果。
以整型为例,具体方式如下:
void print_array(int *a, int m, int n)//a为一个m行,n列的二维数组的首地址。
{
int i, j;
for(i = 0; i m; i ++)
{
for(j = 0; j n; j ++)
{
printf("%d,", a[i*n+j]);//a[i*n+j]也就是原始二维数组第i行第j列的元素。
}
printf("\n");//每行结束输出换行。
}
}
C语言如果给函数传递二维数组作为参数
先看一个传递二维数组的例子:
编译:
程序看着没有任何问题,但是编译器通不过,报错在处理二维数组参数a的时候,类型不兼容。
C语言里面对二维数组的存储是按照一维数组来处理的,二维数组按照行展开的方式按顺序存储,例如在上面的例子中:
二维数组a的定义:
它等同于一维数值的定义:
因为他们的空间存储分配一样的。
所以在利用二维数组作为参数传递时,必须指定二维数组的列数,否则函数无法勾画出二维数组的组织形式。只有有了列长度,通过下标a[i][j]时才能得到正确的下标地址,即:
我们改一下上面的额foo函数定义:
编译运行:
这下就正常了。
参数如上所列。
我们看到,函数的参数声明改成了:
这个声明的含义是:
不过此时还是需要指定二维数组的列长度,不然函数内部还是无法使用二维下标去访问数组:
编译:
原因同前面方法1一致,如果要访问二维数组,必须指定列的长度,否则无法计算出该元素的地址,a[i][j]=a [ (i-1)*COLNUM + j ],如果没有COLNUM,那么这个地址无法计算出来。从形参的声明来说,a就是一个指针,指向一维数组的指针,而不是一个二维数组。
这里要注意的是指针的指针,和二维数组的差异;二维数组的地址是连续的,所有成员按顺序排序;而指针的指针只要求指针地址连续,而不要求指针的指针地址连续。
然后作为实参传递时,也不能直接使用a传递,因为类型不匹配,必须定义新的变量p,然后把a的值赋给p,再传递给foo函数。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流