精华内容
下载资源
问答
  • 在这里我通过讲解一个交换函数来讲解一下什么时候传参需要用指针接收。   这里先看一段代码,很多初学者对指针掌握不够,经常会写出这样的代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h&...

    在这里我通过讲解一个交换函数来讲解一下什么时候传参需要用指针接收。

     

    这里先看一段代码,很多初学者对指针掌握不够,经常会写出这样的代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    void Swap(int x, int y)
    {
    	int tmp = x;
    	x = y;
    	y = tmp;
    }
    int main()
    {
    	int a = 10;
    	int b = 20;
    	Swap(a,b);
    	printf("a=%d b=%d\n", a, b);
    	system("pause");
    	return 0;
    }

     这样的代码调试也没有问题,逻辑就是将a,b传入Swap函数,Swap函数就是实现交换功能的,但当我们运行会发现a,b的值并没有交换,如图:

    这是为什么呢?我们会发现我们的交换函数写的并没有问题,可是为什么不能完成交换?这里就我们就需要自己调试程序了,按F10 开始调试程序,这里附上调试部分截屏:

    刚开始调试,主函数刚开始,未执行时a,b值分别为5241300 5241280,按F10往下逐过程调试 

     

     执行完12,13行的赋值语句,我们发现a,b的值已经变为赋值的10和20,这时来到Swap函数,进入函数之前,我们在监视框中添加&a和&b,对a,b的地址进行监视,得到a,b的地址分别为0x00effbf8,0x00effbec;

    此时来到了Swap函数,按F11进入函数内部,这时在下面监视框里加上x,y,我们会发现a,b的值已经传给了x和y,这里同样监视添加&x,&y,得到x和y的地址分别为0x00effb14,0x00effb18

    很明显,虽然 将a,b的值传给了x,y,但是a,b的地址与x,y的地址却不相同,那么改变x,y的值会改变a,b 的值吗?按F10继续调试

    把Swap函数执行到最后一行,我们发现x和y的值确实发生了交换,这时我们继续调试,看看a,b的值是否发生了交换;

    我们发现a,b的值并没有发生交换,那么这就说明上面的问题了,地址不同,改变x,y的值并不能改变a,b的值。这里a,b叫实参,x,y叫形参,改变形参的值实参不会发生改变。那么要改变a,b的值,就要把地址传给x,y,说到地址大家就会想到指针,指针变量就是存放地址的,那么这里先给出正确的代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    void Swap(int *px, int *py)
    {
    	int tmp = *px;
    	*px = *py;
    	*py = tmp;
    }
    int main()
    {
    	int a = 10;
    	int b = 20;
    	Swap(&a, &b);
    	printf("a=%d b=%d\n", a, b);
    	system("pause");
    	return 0;
    }

     这里在传参时传a,b的地址,所以写为 Swap(&a,&b); 而要接收地址,就要用指针变量来接收,指针变量就是存放地址的。

    在这里举个例子:   *p = 20;    这个代码理解为:通过p找到地址,并把20赋值给此地址所指的值。

                                    int *p = &num;     这里为了方便理解写成 int *       p =&num; 表示为p是一个地址,类型是整形指针变量,这                                                                                                                                              样就很好理解了 

    加上上面的题目,我想大家很好理解为什么要用指针了,如果要改变传入参数的值,就必须传指针。

    最后给出结果:

     

     

     

     

    展开全文
  •  cout交换前:";  cout,";  p_1=&a;  p_2=&b;  swap(p_1,p_2);  cout交换后:";  cout,";  return 0; } void swap(int*x,int*y) {  int temp;  temp=*x;  *x=*y;  *y=temp;...
    #include<iostream>
    using namespace std;
    int main()
    {
     void swap(int*x,int*y);
     int a,b;
     int *p_1,*p_2;
     cout<<"请输入两个数:";
     cin>>a>>b;
     cout<<"交换前:";
     cout<<a<<","<<b<<endl;
     p_1=&a;
     p_2=&b;
     swap(p_1,p_2);
     cout<<"交换后:";
     cout<<a<<","<<b<<endl;
     return 0;
    }
    void swap(int*x,int*y)
    {
     int temp;
     temp=*x;
     *x=*y;
     *y=temp;
    }
    展开全文
  • 调用函数实现两个数交换

    千次阅读 2018-04-14 09:58:07
    两个数的交换:#include &lt;stdio.h&gt;void exchange(int one, int another);void exchange(int one, int another) { int tmp; printf("exchange():%p\n", &amp;tmp); tmp = one; one...
    两个数的交换:
    #include <stdio.h>
    void   exchange(int one, int another);
    void   exchange(int one, int another) {
     int tmp;

        printf("exchange():%p\n", &tmp);
     tmp = one;
     one = another;
     another = tmp;
     }

    int main() {
     int num1;
     int num2;
        printf("请输入两个数:");
        scanf("%d%d", &num1, &num2);
        exchange(num1 ,num2);
        printf("交换结果:%d %d\n", num1, num2);
     
        return 0;
    }
    函数exchange()并不能实现主函数中num1和num2空间的值交换。原因:在主函数调用函数exchange()时,以栈“先进后出"的原则,先将并num1空间的值传递给one空间再将num2空间的值传递给two空间,再在exchange()函数中借助局部变量tmp,将one和two空间的值进行交换,此刻num1和num2空间的值未因此改变。调用完毕后,指针回落,tmp,two和one空间将会出栈,不在受到栈的束缚,而num1和num2空间并未发生变化。因此exchenge( )函数并不能将num1和num2中的值进行交换。

    为了实现num1和num2空间值得交换。我们将采用地址传递的方法。代码如下:
    #include<stdio.h>
    void  realchange(int *, int *);

    void  realchange(int *one, int *another)
    {
    int tmp;
    tmp =*one;
    *one = *anthoner;
    *another = tmp;
    }
    int main()
    {
    int num1;
    int num2;
    scanf('%d %d', &num1,&num2);
    realchange(&num1, &num2);
    printf('交换后:%d %d', num1, num2);
    return 0;
    }
    主函数在调用realchange()是将num1和num2空间的首地址分别传递给指针变量one和two的空间,即:*one=&num1(one指向num1)*two=&num2(two指向num2) 在realchange()中,将one所指向的空间(num1)的值赋给tmp空间,再将two所指向的空间(num2)的值赋给one所指向的空间,最后将tmp空间的值赋给two所指向的空间.最终达到交换num1和num2空间的值的目的。






    
    展开全文
  • 1.不调用函数法:建立临时变量交换直接在需要处int temp=b; b=a; a=temp;2。宏定义法:加减法、需要时时有括号 a=a+b b=a-b a=a-b#define swap(a,b) ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))缺点:a+b可能会溢出3....

    1.不调用函数法:建立临时变量交换

    直接在需要处

    int temp=b;    b=a;    a=temp;


    2。宏定义法:加减法、需要时时有括号 a=a+b b=a-b a=a-b

    #define swap(a,b) ((a)=(a)+(b);(b)=(a)-(b);(a)=(a)-(b))

    缺点:a+b可能会溢出

    3.函数法:

    I.指针的方法

         void swap(int *_x,int *_y) //主函数中把两个数的地址传过来
        {
                  int  tmp = *_x;    //定义中间变量 然后交换两个数
                    *_x = *_y;
                    *_y = tmp;
          

        }


    II.异或的方法

                                 int Swap3(int *a, int *b)
                                {
                                    *a = *a^*b;
                                    *b = *a^*b;
                                    *a = *a^*b;
                                    printf("%d %d", *a, *b);
                                    return 0;

                                 }

       




    展开全文
  • 调用函数,实现两个数的值交换

    万次阅读 2019-03-31 21:32:16
    2.2、同理,我们在函数调用的时候写入的实参应该两个数的地址;(也可以理解调用函数实现的值交换是对数值地址的地址交换,进而实现的值交换) 3、打印结果。 具体代码如下: #define _CRT_SE...
  • 调用函数时,有两种向函数传递参数的方式: 调用类型 描述 传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。 指针调用 该方法把参数的...
  • 自定义函数及函数调用

    千次阅读 2019-05-10 12:17:10
    传来传去都知道传的到底是什么? 接下来,我就重点围绕道友们常见的问题,说一说: 1、自定义函数声明、函数调用、函数实现 比如:交换两个数的值的自定义函数swap 函数声明方式: void swap(int &a,int &...
  • 调用函数时,有三种向函数传递参数的方式: 调用类型 描述 传值调用 该方法把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。 指针调用 该方法把参数的地址...
  • 调用自定义交换函数swap(int *p1, int *p2),完成三个整数从小到大排列 Input 多组测试数据,每组输入三个任意整数 Output 输出从小到大排列的三个数 Sample Input 9 2 7 0 -2 12 8 3 1 Sample Output 2 7 9 -2 0 12...
  • C语言交换函数

    千次阅读 2018-09-21 22:30:58
    函数调用分析: 调用swap1打印结果:before x = 100 y = 900  after x = 100 y = 900 分析:swap1函数进行数值交换,主函数并没有交换 调用swap2打印结果:before x = 100 y = 900  before a = 0x7fff...
  • C语言函数调用三种方式:传值调用,引用调用和传地址调用
  • 交换两个变量的值,如果是基础类型比如int, 直接进行交换: int aToSwap = 1; int bToSwap = 2; 一个经典的问题就是如果我有一个swap 方法如下,试问在主函数里调用了这个swap 方法以后 ,从主函数里传入的两个...
  • C语言 函数参数和调用函数

    千次阅读 2019-04-14 08:39:07
    调用函数时,有两种向函数传递参数的方式: 传值调用 默认情况下,C 语言使用传值调用方法来传递参数。一般来说,这意味着函数内的代码不会改变用于调用函数的实际参数。函数 swap() 定义如下: /* 函数定义 */ ...
  • 函数的传值调用和传址调用在C和C++中都是合法的语法,但是引用调用就只是在C++中合法的。1.传值调用:程序:#includevoid swap(int x, int y){ int tmp = x; x = y; y = tmp;}int main(void){ int a = 1, b = 2; ...
  • Java函数调用

    千次阅读 2019-09-26 19:44:23
    函数调用 举例说明Java中函数的调用 public class test { public static void main(String[] args) { int i = 0; func(i); i = i++; System.out.println(i); String str = "hello wo...
  • 函数的声明、定义和调用

    万次阅读 多人点赞 2017-08-08 15:33:13
    本博简单介绍一下C语言中函数声明、定义和调用的概念
  • 因为C++和C是两种完全不同的编译链接处理方式,所以如果直接在C++里面调用C函数,这样链接起来是通不过的,会报链接错误,找函数体,所以要在 C++文件里面显示声明以下一些函数是C写的,要用C的方式来处理...
  • 汇编:函数调用

    千次阅读 2019-07-18 18:57:33
    让我们再回忆一下脑海中关于函数调用的概念,也许会是这个样子: 这里的“控制流转移”又是如何发生的呢?在解释这个之前,也许我们需要科普一点有关于汇编的知识。 2. 函数调用中的一些细节说明 2.1 函数调用中的...
  • 问题及代码: /* ...*All right resvered . *文件名称: test.cpp ...*问题描述: 编制三个程序,分别调用三个版本的swap交换函数,观察结果 *输入描述: 输入两个整数。 *程序输出: 输出两个交换之后的整数。 */
  • c语言函数调用及应用举例

    万次阅读 多人点赞 2019-04-20 16:27:29
    一般来说,执行源程序就是执行主函数main,其他函数只能被主函数所调用,而其他函数之间也可以相互调用。 1.标准库函数: 分为:I/O函数,字符串,字符处理函数,数学函数,接口函数,时间转换和操作函数,动态...
  • 函数调用C语言基础习题

    千次阅读 2019-11-30 20:17:56
    大多还是把以前的一些程序改了改,练习函数调用,在以后的编程中要多用函数调用,让main函数看起来至于太繁多.题目如下: 1.实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定, 输入9,输出99口诀表,...
  • 通过调用函数实现a与b的交换

    千次阅读 2010-01-29 18:39:00
    实际上只是交换了swap函数中的i和j,而调用完swap函数而回到main函数后,i和j的生命期已经结束了,不会影响a和b。 (通过反汇编)也就是说,swap函数只是交换了a和b的副本。   可做如下修改即可:   ...
  • linux常见系统调用函数列表

    千次阅读 2017-05-11 09:41:18
    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。这可能是你在互联网上所看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,做到这么完全也是很...
  • 深入理解Solidity——函数调用和赋值

    千次阅读 2018-05-19 20:38:45
    函数调用(Function Calls) 内部函数调用(Internal Function Calls) 当前合约的函数可以直接内部(Internal)调用,也可以递归地调用,比如这个古怪的例子: pragma solidity ^0.4.16; contract C { function ...
  • 大家都知道c语言中交换两个变量的值,需要以下代码:
  • 函数模板的使用而言,分为两种调用方式,一种是显示模板实参调用(显示调用),一种是隐式模板实参调用(隐式调用)。对于类模板的使用而言,没有隐式模板实参和显式模板实参使用的说法,因为类模板的使用必须显示...
  • C++继承中构造函数、析构函数调用顺序及虚析构函数 首先说说构造函数,大家都知道构造函数里就可以调用成员变量,而继承中子类是把基类的成员变成自己的成员,那么也就是说子类在构造函数里就可以调用...
  • C语言指针的用法——Swap交换函数

    千次阅读 2019-11-02 12:36:33
    Swap交换函数函数调用子函数,子函数如果想要修改父函数的值,必须传指针(地址),子函数内必须要解引用 子函数的改变要想影响到父函数,必须传指针,解引用 1.传指针:相当于走到房间门口,知道房间的确切位置。 2.解...
  • 我们知道形参值的改变并不能改变对应实参的值,把数据从被调用函数返回到调用函数的唯一途径是通过return语句返回函数值,这就限定了只能返回一个数据。但是通过传送地址值,可以在被调用函数中对调用函数中的变量...
  • C语言函数调用及栈帧分析

    千次阅读 2015-11-16 10:00:54
    C语言函数调用及栈帧分析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 274,356
精华内容 109,742
关键字:

交换函数为什么不能直接调用