今天,我在使用函数调用两个数字交换顺序时,遇到了一个问题,如下
int exchange(int *x, int *y)
{ int t;
t = *x;
*x = *y;
*y = t;}
void main()
{
int a, b, *m, *n;
scanf("%d%d", &a, &b);
m = &a;
n = &b;
exchange(m, n);
printf("%d%d", a, b);
}
很明显这是一个简单的调用,将输入的两个数字,交换顺序,但是,作为一个初学者的我,是这样的
int exchange(int x, int y)
{ int t;
t = x;
x = y;
y = t;}
void main()
{
int a, b, *m, *n;
scanf("%d%d", &a, &b);
m = &a;
n = &b;
exchange(m, n);
printf("%d%d", a, b);
}
这两个代码,很相似,但是第二段代码却不会输入交换后的数字,而结果是输入和输出一模一样,原因是什么了?
当我查阅各种资料得到
重点!!!!!!
如下
第一段代码:将a、b两个数的地址传入exchange()函数,此函数内部拿着这两个数的地址,将两个地址下的值做了交换;
第二段代码:将a、b两个数的地址传入exchange()函数,此函数内部将这两个地址彼此做了交换(即两个指针所指的地址发生了互换,但相应地址下的数并没有变化)。因为对于函数exchange()来说,传入的两个地址是值传递形式的,在其内部是局部作用域下的两个变量,完成这两个地址“值”的交换,并不能对调用时的实参产生影响。故而交换失败。