如何用传址的方式交换两个数的大小
首先先看第一个程序,用函数的调用来解决看似正确实则运行出来的结果是错误的
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int JH(int x, int y);
int main()
{
int a, b;
printf("请输入两个数:\n");
scanf("%d%d", &a,&b);
JH(a, b);
printf("交换后两数的值分别为%d和%d", a,b);
system("pause");
return 0;
}
int JH(int x, int y)
{
int temp;
if (x != y)
{
temp = x;
x = y;
y= temp;
}
return 0;
}
首先我们先来分析一下这个程序,他只该表了x和y的值并未改变a和b的值,由于单向的值传递方式,形参的改变不能使实参发生改变,所哟最后输出的结果仍然和输入的值一样并未改变a和b的值。因此 行参只是实参的一个拷贝,形参改变了只是拷贝改变了,实参仍为原来的值,但是你如果用传址调用的话,把形参定义为指针变量,实参调用地址的话,单你把指针所指的变量改变,实参所对应的值也改变了。所以下面我们来修改这个程序
<pre name="code" class="csharp">#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int JH(int *x, int *y);
int main()
{
int a,b,*p1,*p2;
printf("请输入两个数:\n");
scanf("%d%d", &a,&b);
p1 = &a;
p2 = &b;
JH(p1,p2);
printf("交换后两数的值分别为%d和%d", *p1,*p2);
system("pause");
return 0;
}
int JH(int *x, int *y)
{
int p;
if (*x != *y)
{
p = *x;
*x = *y;
*y = p;
}
return 0;
}
改进后的程序运行出来是没有问题的