C语言中 指针做函数参数传递二维数组

C语言中 指针做函数参数传递二维数组,第1张

#include <stdioh>

void fun(int (p1)[3],int (p2)[3]);

int main()

{

int p1[3][3]={{7,8,9},{4,5,6},{1,2,3}} ;

int p2[3][3] = {0};

int i = 0, j = 0;

fun(p1,p2);

for(i = 0;i < 3;i++){

for(j = 0;j < 3;j++){

printf("%d ",((p2+i)+j));    

}

printf("\n");

}        

return 0;

}

void fun(int (p1)[3],int (p2)[3])

{

int i = 0,j = 0;

for(i = 0;i < 3;i++){

for(j = 0;j < 3;j++){

(p2[j]+i) = (p1[i]+j);

}

}

}

扩展资料:

函数指针的声明方法为:

返回值类型 (  指针变量名) ([形参列表]);

其中,“返回值类型”说明函数的返回类型,“(指针变量名 )”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如:

int func(int x); / 声明一个函数 /

int (f) (int x); / 声明一个函数指针 /

f=func; / 将func函数的首地址赋给指针f /

或者使用下面的方法将函数地址赋给函数指针:

f = &func;

赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

参考资料:

-函数指针

传递分为值传递和地址传递。

例如:算出A(10,9,1),B(1,6,5),C(4,5,6),D(1,2,3)

四人语数外总分。

#include <sydioh>

void main ()

{ int f (int s2[][],int i,int j);

int s1[4][3]={(10,9,1),(1,6,5),(4,5,6),(1,2,3)};

int i, j,s=0

for (i=0;i<4;i++)

{for (j=0;j<3;j++)

s+=f(s1,i,j);\\调用函数

printf("\n");

}

}

int f (int s2[][],int i,int j)

{return a[i][j];

}

由于VB的理念所致,他没有指针的应用,所以你的想法不能用常规的VB做法实现。但VB其实并不是没有指针,只是不推荐使用,如果一定要这样,可以使用强制指针类型,这个网上也有,你可以找找,不过确实,不推荐,因为这样并不安全。

其实,可以在传递参数之前做一些别的工作,比如把你要的数据先复制到一个新的数组里,然后在传递这个新的数组。虽然效率低了,但更加安全。。。这就是VB的理念,没办法~

ls几个真是太不负责任了, 想当然的int

为什么不自己亲自try it

一般来说数组的传递方法应该是这种形式的

void function(type arrayName[][a][b][c]){

}

如果是一维数组 void F(type N[]) (简写)

二维 void F(type N[][a]) ,这里a是一个数

以此类推

lz这里就应该是void gaibian(int b[][2])

我们平时经常可以看到void F(type N)这样的形式,用来传递数组。

然而实际上这只是种取巧的手段,因为数组某种程度上和指针是等价的。

上面那种形式的真正意义应该是“传递指针”。

应该再明确一点:

是数组的名字和指针变量的 *** 作方式很相似。

譬如int a[10], 与 int a;

都可以用 (a+i) 与 a[i] 这两种索引方法

如果对于多维数组就不完全一样了

譬如int a[10][10]; int b;

b=a;

那么 a[i][j] 与 b[10i+j]是相等的。

因此lz的函数也可以改成这样子:

void gaibian(int b)

{

b[02+0]=1;

b[02+1]=2;

b[12+0]=3;

b[12+1]=4;

}

编译可以通过, 但会受到一个警告“int ”与“int [2][2]”的间接级别不同

Whatever, 数组参数绝对不应该有type 这种类型

刚才看资料, 发现还有一种形式, 应该说更接近本质的形式

void function(type (arrayName)[a][b][c]){

}

它与

void function(type arrayName[][a][b][c]){

}

不同之处就是arrayName[]换成了(arrayName)

意思都差不多, 效果也差不多。

int func(int a){

  input(size);

  malloc(a, size);

  do something;

  free(a);

}

规定若是将二维数组作为实参传递给函数,那么在函数的参数声明中必须显示地指明数组的列数,因此可以改为如下:

将int mColoring(int n, int m, int a) 改为int mColoring(int n, int m, int (a)[4]),或者直接就写为int mColoring(int n, int m, int a[4][4]),亦或者int mColoring(int n, int m, int a[][4])。参数的行数没有关系。

二维数组的两个维数,第二个维数不能在调用的时候确定。

这是因为二维数组在内存中的连续存放的。

从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能只指定一维而不指定第二维。

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

原文地址: http://outofmemory.cn/langs/11678819.html

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

发表评论

登录后才能评论

评论列表(0条)

保存