函数中值交换,形参与实参入栈的相关问题

    初学函数时,曾遇到过这样一个问题:如何用一个函数将两个值交换。开始时,觉得这个问题没有多大的问题,于是自信的编出了下面的代码:

                          

#include<stdio.h>
void exchange(int, int);
void exchange(int one, int another)
{
int tmp;
tmp = one;
one = anthoner;
another = tmp;
}
int main()
{
int num1;
int num2;
scanf('%d %d', &num1,&num2);
exchange(num1, num2);
printf('交换后:%d %d', num1, num2);
return 0;
}

      编译过后发现了一个问题:函数里值并没有交换!由于初学,自己找不到错误的地方。后来向老师请教,才明白,这简单的一个函数其中蕴含了多少知识。先把正确的代码展现出来:

#include<stdio.h>
void exchange(int *, int *);
void exchange(int *one, int *another)
{
int tmp;
tmp =*one;
*one = *anthoner;
*another = tmp;
}
int main()
{
int num1;
int num2;
scanf('%d %d', &num1,&num2);
exchange(&num1, &num2);
printf('交换后:%d %d', num1, num2);
return 0;
}

            

                                                                                                        (这个栈指的是系统管理内存角度的“系统堆栈”)        

      其中主现为主现场函数信息,当前栈顶指针为exchange()函数执行时栈顶指针的情况。第一段代码的错误在于,因为exchange函数调用时,只是把num1和num2空间内的值复制一份赋值给one和another,函数只是对两个形参变量进行操作,并没有对实参变量num1和num2空间内的值进行互换,调用完毕后栈顶指针回落到初始指针的位置。形参变量one和another的内存空间不再受操作系统控制,因此输出的num1和num2仍然是之前的值。


                                int *one = &num1;     int *another = &num2;

     在这段程序中,函数将实参的首地址,分别传给形参。这使形参的值指向了实参的空间!即one指向了num1,another指向了num2。因此实参在进行值的交换时,实参对应的空间也进行了交换。所以最后输出的结果是:num1、mun2两数值进行了交换。

阅读更多
文章标签: 形参与实参
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭