c语言二维数组怎么用函数一个一个调用,这样对吗

c语言二维数组怎么用函数一个一个调用,这样对吗,第1张

对的,是我的第二种方法。
1可以用指针。
void Func(int array, int m, int n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为:
((int)array + ni + 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];
这时形参数组只取实参数组的一部分,其余部分不起作用。

方法很多。
看前面都有答了。
就写个指针的方法:
用指向指针的指针来实现倒置后的二维数组。
倒置后原数组不变。

#include <stdioh>
#include <malloch>
#define ROW 2
#define CLO 3
int fzz(int a[][CLO]);
void printfARR(int arr);
int main()
{
    int i,j,arr[ROW][CLO]={{1,2,3},{4,5,6}},p=fzz(arr);
    printf("原数组:\n");
    for(i=0;i<ROW;i++,printf("\n"))
        for(j=0;j<CLO;j++)
            printf("%d ",arr[i][j]);
     printf("倒置后的数组:\n");
     for(i=0;i<CLO;i++,printf("\n"))
        for(j=0;j<ROW;j++)
            printf("%d ",p[i][j]);
    return 0;
}
void printfARR(int arr)
{
    int i,j;
    for(i=0;i<ROW;i++,printf("\n"))
        for(j=0;j<CLO;j++)
            printf("%d ",arr[i][j]);
}
int fzz(int arr[][CLO])
{
    int i,j,arr2=(int )malloc(sizeof(int )CLO);
    if(!arr2)
        return NULL;
    for(i=0;i<CLO;i++)
    {
        arr2[i]=(int )malloc(sizeof(int)ROW);
        if(!arr2[i])
            return NULL;
        for(j=0;j<ROW;j++)
            arr2[i][j]=arr[j][i];
    }
    return arr2;
}

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

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

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

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

函数原型 type fun (type (name)[size])

type是你要定义的类型,fun是函数名,name是在函数中二维数组的名字,
size是二维数组第2维的长度。
这样调用这个函数只需要把二维数组函数名传递就可以了。

我用PASSCAL写的;
program ewsz;
var
i,j:longint;z:real;
A:array[14,13]of longint;
B:array[13,15]of longint;{由具体题目自订}
function work:real;{二维数组的处理函数}
var i,j:longint;SA,SB:real;
begin
SA:=0;SB:=0;
for i:=1 to 5 do
for j:=1 to 5 do
begin
SA:=SA+sqrt(A[i,j]);
SB:=SB+sqrt(B[i,j]);
end;
work:=(4SA)/(SB3);
end;
begin{主程序}
fillchar(A,sizeof(A),0);
fillchar(B,sizeof(B),0);
for i:=1 to 4 do
begin
for j:=1 to 3 do
read(A[i,j]);
readln;
end;
for i:=1 to 3 do
begin
for j:=1 to 5 do
read(B[i,j]);
readln;
end;
z:=work;
write(z:0:3);
end{我没运行,你自己检查一下嘛!}

有两种方式:
一种为你的这种形式:
print(int a[][3],int n){}
另一种为print(int (a)[3],int n){}
为二维数组时,第二维不能省略,并且最好与实参的第二维一样。
在调用时,只要写二维数组名即可。可以写成print(a,5);实参数组名为a的情况下。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13392108.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-27
下一篇 2023-07-27

发表评论

登录后才能评论

评论列表(0条)

保存