二维数组地址传递的问题,求帮助~
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维数组地址传递的问题,求帮助~相关的知识,希望对你有一定的参考价值。
大家好,假如我在主程序中有Q[10][15]这样的一个二维数组,现在我想将这个二维数组传递到子程序P[10][15]中,我是这样写的:
float blending(float P[10][15]);
void main()
float Q[10][15];
float y
......
y=blending(Q);
……
float blending(float P[10][15])
if(…)
blending(P);
if(…)
…
return
我那样子的传递是地址传递,但是我在子程序中又会再次的调用子程序而且会改变数组P的值,由于是地址传递,主程序中的数组Q[10][15]的元素的值也就改变了,但是我又要之后又要用到数组Q中元素的值,也就不希望改变Q中的值。
请问我应该怎么样调用??难道要把Q中的元素一个一个调用进P吗??
谢谢了,回答满意再加分~
由于是地址传递,要同时满足这两个要求是不可能的。
如果你希望的是在 blending 函数中,可以同时拥有从main 传入的数组,以及从递归调用后返回的另一个数组的,可以在blending 中声明一个数组副本,将形参复制给这个副本,并将副本递归传递。
float blending(float P[10][15])
float cl[10][15];
memcpy(cl, P, sizoef(float)*10*15);
if (...)
blending(cl);
if (...)
...
return
如果你仅仅是希望main 中的Q数组不变化,而传入blending 函数的数组可以变化,那在main中复制数组,并将副本传入blending函数。追问
恩,没有听过数组副本...我试了一下,它提示说构成有错误,是不是格式不对啊?
追答这是我随便写的示例代码,可以正常编译,供参考
int main()
float a[3][4];
float b[3][4];
memcpy(b, a, sizeof(float)*3*4);
return 0;
float blending(float p[3][4])
float t[3][4];
memcpy(t, p, sizeof(float)*3*4);
int i = 0;
if (i < 10)
blending(t);
else
i++;
return 0.0;
float blending(float P[10][15])
if(…)
int temp;
temp=P[x][y];
P[x][y]=新值;
blending(P);
P[x][y]=temp;//恢复
if(…)
return
不知道你是不是这个意思 参考技术B float blending(float (*p)[15]);试试
你的方法是另外创建了一个二维数组,所以值才会不一样
你要做的是传一个二维数组的指针进去,所以才要用到float (*p)[15]来创建一个二维数组类型的指针追问
额,我明白你说的,那我调用还是用blending(Q)么??
试了,没有语法错误,但是运行不出来~
#include
void show(float (*num)[2])
int i,j;
for (i=0;i<2;i++)
for (j=0;j<2;j++)
printf("%.1f ",num[i][j]);
printf("\n");
void main(void)
float num[2][2]=
1.2f,1.3f,1.4f,1.5f
;
show(num);
我试了,是可以的
怎样求一个二维数组元素之和以及二维数组元素的最小值及下标
这里需要用到指针,可以用到地址法(a[i]+j这样的)或者指针(ptr++这种)来输入输出二维数组的各个元素,然后求和最小值 假设二维数组下标为0的元素最小和用指针指向该元素,后续的元素和其比较,若还有更小的则替换 然后输出其值和对应的指针 指针所指地址为其下标所指地址 参考技术A 类似题目二维数组在内存中是按行存放,假定我们定义二维数组和指针如下:int a[3][4],* p = a[0];
则指针p就指向二维数组。其在内存的存放情况如图6 - 11所示。
从上述存放情况来看,若把二维数组的首地址传递给指针p,则映射过程如图6 - 11所示。我们只要找到用p所表示的一维数组中最大的元素及下标,就可转换为在二维数组中的行列数。 #include<stdio.h>
main( )
int a[3][4],*ptr,i,j,max,maxi,maxj;
/ * max 是数组的最大, maxi 是最大元素所在行, maxj 是最大元素所在列* /
for(i = 0; i < 3; i ++)
for(j = 0; j < 4; j ++)
scanf("%d", &a[i][j]);
ptr = a[0]; / * 将二维数组的首地址传递给指针变量* /
max_arr(ptr, &max, &maxi, 12);
maxj = maxi % 4; / * 每行有四个元素,求该元素所在列* /
maxi = maxi / 4; / * 求该元素所在行* /
printf("max=%d,maxi=%d,maxj=%d",max,maxi,maxj);
int max_arr(b,p1,p2,n)
int *b,*p1,*p2,n;
/ * b 指向二维数组的指针, p1指向最大值,p2 指向最大值在一维数组中的位置, * /
/ * n 是数组的大小* /
int i;
*p1=b[0]; *p1=0;
for(i = 1; i < n; i++) / * 找最大* /
if (b[i]>*p1)
*p1=b[i]; *p2=i;
运行程序:
4 7 8 9
3 7 9 3
1 5 2 6
max=9, maxi=0,maxj=3
以上是关于二维数组地址传递的问题,求帮助~的主要内容,如果未能解决你的问题,请参考以下文章