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

原创 2018年04月17日 19:03:11

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

                          

#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两数值进行了交换。

Excel函数教程(下)

EXCEL公式是EXCEL工作表中进行数值计算的等式。全套课程全部以实际操作来讲解下主要函数公式的使用方法和步骤(EXCEL2016为例),Office其他版本依旧可以使用!
  • 2017年03月10日 13:39

函数的形参与实参的关系

函数的形参与实参实际上是一个“="的赋值关系,明白了这一点对于就更容易理解一些复杂的形实参的形式,如函数定义:int splitfloat(float x, int * intpart,float ...
  • SdustLiYang
  • SdustLiYang
  • 2011-07-07 08:43:10
  • 1179

形参和实参之间的三种传递方式

//形参和实参之间的三种传递方式 void fun(int i) {  i++;} void fun(int &i) {  i++;} void fun(int *i) {  *i=*i+...
  • WSF861559021
  • WSF861559021
  • 2011-11-28 19:39:42
  • 2628

指针-形参与实参-函数传参

今天看到一篇博客:http://blog.csdn.net/a475701239/article/details/11179351 里面的函数...
  • jin615567975
  • jin615567975
  • 2014-10-01 11:15:01
  • 856

形参与实参的区别。

1、形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。 2、实参可以是常量、变量、表达式、...
  • u012312103
  • u012312103
  • 2016-03-24 22:33:37
  • 371

形参与实参之间的值传递

先说形参与实参的数值传递:        函数调用时将实参数传递给形参称为参数传递。C语言中,参数的传递方式是“单向值传递”,形参和实参变量各自有不同的存储单元,被调用函数中的形参变量值的变化不...
  • u012218650
  • u012218650
  • 2013-10-09 11:45:20
  • 3675

JAVA基础之形参与实参的区别

形参定义:全称"形式参数",用于定义方法的时候使用的参数,目的用来接收调用该方法时传递的参数。说明:只有在被调用时才会分配内存单元,在调用结束,即刻释放所分配的内存单元。因此,只在方法内才有效。实参定...
  • qq_21806621
  • qq_21806621
  • 2017-03-15 22:23:42
  • 5143

实参与形参的传递关系

当我们在主调函数中调用方法的时候,需要把类型匹配的实际的数据传入到方法中。传进去的那个数据就是实参,而在方法定义中接收参数的那个变量就是形参。下面分三种情况讨论: 1、传递基本数据类型: 这种情况...
  • yus201120
  • yus201120
  • 2016-04-22 13:04:44
  • 1847

C语言的实参与形参

调用函数 值传递 形参 实参 指针
  • u010643777
  • u010643777
  • 2015-05-30 10:31:43
  • 1950

C的形参和实参的关系

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。在一般传值调用的机制中只能把实参传送给形参...
  • diwenzhi
  • diwenzhi
  • 2015-12-03 17:49:38
  • 2466
收藏助手
不良信息举报
您举报文章:函数中值交换,形参与实参入栈的相关问题
举报原因:
原因补充:

(最多只允许输入30个字)