有关C语言中结构体变量做函数参数的问题

代码如下
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct Max_Element
{
int row;
int col;
double date;
};
void Max_Element_Find(struct Max_Element maxA,double *A,int n)
{
int i,j;
//maxA.date = 0.0;
for(i=0;i<n;i++)//找出A中非对角线元素中绝对值最大的元素
{
for(j=0;j<n;j++)
{
if(j!=i)
if(fabs(A[i*n+j])>maxA.date)
{
maxA.date = fabs(A[i*n+j]);
maxA.row = i;
maxA.col = j;
}
}
}
}

int main()
{
int i,j,n;
scanf("%d",&n);
double *A = (double*)malloc(sizeof(double)*(n*n));
for(i=0;i<n*n;i++)
{
scanf("%lf",&A[i]);
}
struct Max_Element maxA={0,1,0.0};
Max_Element_Find(maxA,A,n);
printf("%lf %d %d\n",maxA.date,maxA.row,maxA.col);
free(A);
return 0;
}
程序能够运行,但是发现运行的结果maxA的值并没有改变,在调试时发现maxA中的值改变了,但是输出时没有改变,这是怎么回事?
程序功能:找出A中非对角线元素中绝对值最大的元素。
测试数据,n=2, A={1,2,3,4},用的编译器是NetBeans。求大神解答,谢谢啦!

其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变
实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。但是你的实参没变
因此结果没变
改,对于子函数中,你在void Max_Element_Find(struct Max_Element* maxA,double *A,int n)

Max_Element_Find(&maxA,A,n);这样就好了追问

改了之后又出现了这样的错误

追答

由于maxA是个指针,你应该用maxA->date,下面也一样

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct Max_Element
{
int row;
int col;
double date;
};
void Max_Element_Find(struct Max_Element &maxA,double *A,int n)
//把struct Max_Element&maxA参数改成引用类型!!!!!!!!!!!!!!!!
{
int i,j; //maxA.date = 0.0;
for(i=0;i<n;i++)//找出A中非对角线元素中绝对值最大的元素
{
for(j=0;j<n;j++)
{
if(j!=i)
if(fabs(A[i*n+j])>maxA.date)
{
maxA.date = fabs(A[i*n+j]);
maxA.row = i;
maxA.col = j;
}
}
}
}
int main()
{
int i,j,n;
scanf("%d",&n);
double *A = (double*)malloc(sizeof(double)*(n*n));
for(i=0;i<n*n;i++)
{
scanf("%lf",&A[i]);
}
struct Max_Element maxA={0,1,0.0};
Max_Element_Find(maxA,A,n);
printf("%lf %d %d\n",maxA.date,maxA.row,maxA.col);
free(A);
return 0;
}追问

改了之后又出现了这样的错误

追答

直接把我发的复制过去就好

第2个回答  2013-07-26
这就是传参的典型问题了,你使用的是直接传参,只不过是对拷贝了一份的变量进行操作,所以你调试时进入Max_Element_Find函数显示的是拷贝的maxA的变化,但是出了函数那份拷贝就不存在了,主函数的maxA还是他自己。用引用传值才是改变变量本身。建议你搜搜引用传参与按值传参的区别。追问

该怎样改啊

追答

好吧,看到你已经改好了。。。

第3个回答  2013-07-26
void (struct ,double *A,int n) 关键在于这个函数的参数传递方式,struct Max_Element maxA 既不是引用也不是指针,那么函数Max_Element_Find 在传递实参的时候,会复制一份用来进行计算,之所以没有改变函数外面的变量,是因为函数内部运算过程中使用的变量是函数外部变量的一份拷贝。追问

原来是这样啊,这个程序该怎样改呢?

追答

将函数定义 void Max_Element_Find(struct Max_Element maxA,double *A,int n)

改成 void Max_Element_Find(struct Max_Element& maxA,double *A,int n)

追问

改了之后又出现了这样的错误

追答

将引用写在左边void Max_Element_Find(struct Max_Element& maxA,double *A,int n)

第4个回答  2013-07-26
要传地址,传值只是复制了一个副本,不改变原来的结构体。形参与实参的关系。。。追问

该怎样改啊

相似回答