有关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。求大神解答,谢谢啦! 展开
#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。求大神解答,谢谢啦! 展开
5个回答
展开全部
#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;
}
#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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这就是传参的典型问题了,你使用的是直接传参,只不过是对拷贝了一份的变量进行操作,所以你调试时进入Max_Element_Find函数显示的是拷贝的maxA的变化,但是出了函数那份拷贝就不存在了,主函数的maxA还是他自己。用引用传值才是改变变量本身。建议你搜搜引用传参与按值传参的区别。
追问
该怎样改啊
追答
好吧,看到你已经改好了。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
要传地址,传值只是复制了一个副本,不改变原来的结构体。形参与实参的关系。。。
追问
该怎样改啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询