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

代码如下#include<stdio.h>#include<stdlib.h>#include<math.h>structMax_Element{introw;intco... 代码如下
#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。求大神解答,谢谢啦!
展开
 我来答
百度网友8e65fcc
推荐于2017-11-28 · 超过23用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:55.6万
展开全部
其实,结构名就是一个变量,由于你的形参和你的实参取名是一样的。而且对于形参肯定会变
实参不会变。所以,你中间的maxA变量,其实是子函数的形参变了。但是你的实参没变
因此结果没变
改,对于子函数中,你在void Max_Element_Find(struct Max_Element* maxA,double *A,int n)

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

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

追答
由于maxA是个指针,你应该用maxA->date,下面也一样
阳顶天鹿鼎记
2013-07-26 · TA获得超过502个赞
知道小有建树答主
回答量:675
采纳率:100%
帮助的人:385万
展开全部
#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;
}
追问

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

追答
直接把我发的复制过去就好
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友05ca588
2013-07-26 · 超过19用户采纳过TA的回答
知道答主
回答量:36
采纳率:0%
帮助的人:47.2万
展开全部
这就是传参的典型问题了,你使用的是直接传参,只不过是对拷贝了一份的变量进行操作,所以你调试时进入Max_Element_Find函数显示的是拷贝的maxA的变化,但是出了函数那份拷贝就不存在了,主函数的maxA还是他自己。用引用传值才是改变变量本身。建议你搜搜引用传参与按值传参的区别。
追问
该怎样改啊
追答
好吧,看到你已经改好了。。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lyklau
2013-07-26 · TA获得超过192个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:100万
展开全部
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)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
周生008
2013-07-26 · TA获得超过1220个赞
知道小有建树答主
回答量:1329
采纳率:0%
帮助的人:616万
展开全部
要传地址,传值只是复制了一个副本,不改变原来的结构体。形参与实参的关系。。。
追问
该怎样改啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式