精华内容
下载资源
问答
  • 调用函数实现两个数交换

    千次阅读 2018-04-14 09:58:07
    两个数交换:#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...
    两个数的交换:
    #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空间的值的目的。






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

    万次阅读 2019-03-31 21:32:16
    调用函数,实现两个数的值交换 编程思路: 1、键入两个整数a,b; 2、调用无返回值类型的函数,实现对两个数的值交换; 2.1、在函数实现部分,我们引入的参数应该是引入指针类型的参数来调用实参; 2.2、同理,我们...

    调用函数,实现两个数的值交换

    编程思路:

    1、键入两个整数a,b;
    2、调用无返回值类型的函数,实现对两个数的值交换;
    2.1、在函数实现部分,我们引入的参数应该是引入指针类型的参数来调用实参;
    2.2、同理,我们在函数调用的时候写入的实参应该为两个数的地址;(也可以理解为调用函数实现的值交换是对数值地址的地址交换,进而实现的值交换)
    3、打印结果。

    具体代码如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    
    void swap(int* a, int* b) {
    	int tmp;
    	tmp = *a;
    	*a = *b;
    	*b = tmp;
    }
    
    int main(){
    	int a, b;
    	printf("请输入两个整数:\n");
    	scanf("%d %d", &a, &b);
    	printf("交换后的值为:\n");
    	swap(&a, &b);
    	printf("a = %d b = %d",a, b);
    	system("pause");
    	return 0;
    }
    
    展开全文
  • 大家都知道c语言中交换两个变量的值,需要以下代码:

    大家都知道c语言主函数中交换两个变量的值,可以通过以下代码实现:

    #include<stdio.h>

    int main()

    {

           int a=10,b=20,temp;//先定义一个temp

       //以下实现两个变量的交换(具体理解请参照图一)

            temp=a;

            a=b;

            b=temp;

           printf("a=%d,b=%d",a,b);//此时a=20,b=10;

           return 0;

    }

    主函数中两个变量的值交换

    但是如何通过调用函数实现交换两个变量的值呢?

    首先我们先写一下主函数

    #include<stdio.h>

    //调用函数前应先声明一下被调用函数,此处暂时省略,分析完毕形参后,会写上正确格式

    //主函数

    int main()

    {

       int a=10,b=20;

       swap(       );//此处正确写法应加入实参,但是为了分析,此时暂未写实参

    printf("a=%d,b=%d",a,b);

    return 0;

    }

    //以下为被调用函数中常见错误

    //常见错误1:

    void swap(  int m,int n  )//接收a和b的值

    {

       int temp=m;

            m=n;

            n=temp;

    }

    //此处错误在于,此处为值传递,被调函数swap中交换了m和n的值,并未交换主函数中a,b的值,所以a和b输出结果仍然为a=10,b=20;具体参考下图

    //常见错误2:

    void swap(  int *m,int* n  )//接收a和b的地址

    {

       int *temp=m;//定义一个指针temp,把指针m中的地址赋给指针temp

            m=n;

            n=temp;

    }

    //此处错误在于,swap中实现了,两个指针m和n指向的交换,但是并未对主函数中的a和b进行操作,所以输出结果依然为a=10,b=20;具体参考下图

    //正确写法如下:

     

    void swap(  int *m,int* n  )//接收a和b的地址

    {

       int temp=*m;;//定义一个整形变量temp,然后把指针m指向的a中的值,赋给temp,此处实现了对主函数中a的操作

            *m=*n;

            *n=temp;

    }

    //从上面即可知道主函数,需要传递给swap函数的实参为a和b的地址,从而主函数调用部分实参和声明应该写为:

    #include<stdio.h>

    void swap(  int *m,int* n  );

    //上面正确的swap函数应该复制在此处;

    int main()

    {

       int a=10,b=20;

       swap(&a,&b);

       printf("a=%d,b=%d",a,b);//此时a=20,b=10;

       return 0;

    }

    //以下为具体操作流程图:

     

    展开全文
  • 用一个函数指针来交换两个数
  • 今天问一个简单的问题,如何用JAVA写一个函数交换两个数并在main函数中输出交换呢? 01 简单方案-----错误方法 首先想到的是这种方法,用一个中间数,然后直接交换。 代码如下 /** *@author *@email *@...

    今天问一个简单的问题,如何用JAVA写一个函数交换两个数并在main函数中输出交换呢?

     

    01简单方案-----错误方法

    首先想到的是这种方法,用一个中间数,然后直接交换。

    代码如下

    /**
     * @author 
     * @email 
     * @create 2019-06-26
     */
    public class App {
    
        public static void main(String[] args) {
            int a =10;
            int b = 11;
            exChange(a,b);
            System.out.println("a: "+a+" : "+"b: "+b);
            System.out.println("-----------------------------------");
            int c =132;
            int d = 145;
            exChange(c,d);
            System.out.println("c: "+c+" : "+"d: "+d);
        }
    
        private static void exChange(Integer a,Integer b){
            int t;
            t = a;
            a = b;
            b = t;
        }
    }

    最后输出结果:

    a: 10 : b: 11

    -----------------------------------

    c: 132 : d: 145

    分析:为什么传递一个对象过来还是没有用,原因就在于JAVA中是值传递,没有引用传递的

    02反射方案一------ 只能成功交换一个数

    通过反射改变Integer中的字段value值,从而交换两个数。

    代码如下:

    import org.omg.PortableInterceptor.INACTIVE;
    
    import java.lang.reflect.Field;
    
    /**
     * @author 
     * @email 
     * @create 2019-06-26
     */
    public class App {
    
        public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
            Integer a =10;
            Integer b = 11;
            exChange(a,b);
            System.out.println("a: "+a+" : "+"b: "+b);
            System.out.println("-----------------------------------");
            Integer c =132;
            Integer d = 145;
            exChange(c,d);
            System.out.println("c: "+c+" : "+"d: "+d);
        }
    
        private static void exChange(Integer a,Integer b) throws NoSuchFieldException, IllegalAccessException {
            Integer exchangeNum = a;
            Field filda = a.getClass().getDeclaredField("value");
            filda.setAccessible(true);
            filda.set(a,b);
    
            Field fildb = b.getClass().getDeclaredField("value");
            fildb.setAccessible(true);
            fildb.set(b,exchangeNum);
        }
    }
    

    结果:

    a: 11 : b: 11

    -----------------------------------

    c: 145 : d: 145

    很奇怪的是第一个数交换成功了,但是第二个数却但还是原来的数。这是为什么呢?因此我们猜测一定是这里处理问题。我们去看写的代码,写的地方 fildb.set(b,exchangeNum);我们在交换函数的上面有这样一个代码Integer exchangeNum = a;

    exchangeNum实际上是a的一个副本,a变化就导致exchangeNum变化。因此由于我们首先设置了a的值,后来改变第二个数值,从而导致错误。

    03反射方案二------  -127~128的数交换是错的,其余是对的

    为了不会导致复制的情况发生,那么我们直接来一个int类型的数作为中间值呢?

    代码如下

    import org.omg.PortableInterceptor.INACTIVE;
    
    import java.lang.reflect.Field;
    
    /**
     * @author 
     * @email 
     * @create 2019-06-26
     */
    public class App {
    
        public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
            Integer a =10;
            Integer b = 11;
            exChange(a,b);
            System.out.println("a: "+a+" : "+"b: "+b);
            System.out.println("-----------------------------------");
            Integer c =132;
            Integer d = 145;
            exChange(c,d);
            System.out.println("c: "+c+" : "+"d: "+d);
        }
    
        private static void exChange(Integer a,Integer b) throws NoSuchFieldException, IllegalAccessException {
            int exchangeNum = a;
            Field filda = a.getClass().getDeclaredField("value");
            filda.setAccessible(true);
            filda.set(a,b);
    
            Field fildb = b.getClass().getDeclaredField("value");
            fildb.setAccessible(true);
            fildb.set(b,exchangeNum);
        }
    }

    结果:

    a: 11 : b: 11

    -----------------------------------

    c: 145 : d: 132

    为什么11和10交换的时候,第一个数交换成功,第二个数交换错误呢?难道中间值会跟着第一个数变化,那么开始Debug,发现中间值没有根治变化,那么为什么变化了呢?通过苦思冥想,发现反射给a设置值得时候调用的是, public void set(Object obj, Object value)。传入的是两个对象,而我们的中间值是int类型,那么就会进行自动装箱,即调用

    public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
    }
    

    我们分析这个代码,但我们传入的值在-128~127的时候回从IntegerCache.cache中取值,取得是当前位置为 传入的数+128 位置的值。当我们传入一个10的时候,取得是位置为138的值。而对于一个缓存而言,他原来的样子应该是0~256分别对存储-128~127。因此原来的138位置是10。我们通过Debug发现已经变成了11。那么为什么会这样呢,其实很好理解在第一步,我们把缓存数组,138的位置的value已经修改成了11。所以导致错误。

    04反射方案三------正确

    中间值是通过new一个Integer的形式。

    代码如下:

    import org.omg.PortableInterceptor.INACTIVE;
    
    import java.lang.reflect.Field;
    
    /**
     * @author 
     * @email 
     * @create 2019-06-26
     */
    public class App {
    
        public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
            Integer a =10;
            Integer b = 11;
            exChange(a,b);
            System.out.println("a: "+a+" : "+"b: "+b);
            System.out.println("-----------------------------------");
            Integer c =132;
            Integer d = 145;
            exChange(c,d);
            System.out.println("c: "+c+" : "+"d: "+d);
        }
    
        private static void exChange(Integer a,Integer b) throws NoSuchFieldException, IllegalAccessException {
            Integer exchangeNum = new Integer(a);
            Field filda = a.getClass().getDeclaredField("value");
            filda.setAccessible(true);
            filda.set(a,b);
    
            Field fildb = b.getClass().getDeclaredField("value");
            fildb.setAccessible(true);
            fildb.set(b,exchangeNum);
        }
    }
    

    结果:

    a: 11 : b: 10

    -----------------------------------

    c: 145 : d: 132

    显然答案是对,第一规避方案一副本,第二不会有自动装箱的操作。

    反思

    我们在实际的场景中能否这样做呢?答案自然是不行的,原因是我们已经改变了缓存数组中的值了,在main函数的最后加上这段代码:

    import org.omg.PortableInterceptor.INACTIVE;
    
    import java.lang.reflect.Field;
    
    /**
     * @author 
     * @email
     * @create 
     */
    public class App {
    
        public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
            Integer a =10;
            Integer b = 11;
            exChange(a,b);
            System.out.println("a: "+a+" : "+"b: "+b);
            System.out.println("-----------------------------------");
            Integer c =132;
            Integer d = 145;
            exChange(c,d);
            System.out.println("c: "+c+" : "+"d: "+d);
    
            Integer f =10;
            System.out.println("f: "+f);
        }
    
        private static void exChange(Integer a,Integer b) throws NoSuchFieldException, IllegalAccessException {
            Integer exchangeNum = new Integer(a);
            Field filda = a.getClass().getDeclaredField("value");
            filda.setAccessible(true);
            filda.set(a,b);
    
            Field fildb = b.getClass().getDeclaredField("value");
            fildb.setAccessible(true);
            fildb.set(b,exchangeNum);
        }
    }
    

    输出的结果:

    a: 11 : b: 10

    -----------------------------------

    c: 145 : d: 132

    f: 11

    f怎么变成11了呢?这就很奇怪了,也好理解,因为前面我们把缓存数组的值改变了。因此慎用。

    展开全文
  • C语言:使用函数实现两个数交换

    千次阅读 多人点赞 2018-12-18 22:28:57
    使用函数实现两个数交换 在之前的博客介绍了三种方法实现两个数交换,这次是用函数来实现,想看基本的方法可以去看看我之前的博客哦。 C语言:给定两个整形变量的值,将两个值的内容进行交换...
  • 自己实现swap()函数交换两个数的值

    千次阅读 2015-03-28 11:22:29
    用函数模板自己实现swap()函数交换两个数据类型的值
  • 使用函数实现两个数的代码。 常规思路: 定义函数,调用函数,完成交换。 你的代码是否和下面一样呢? #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; void Swap(int a,int b) { int...
  • 交换两个变量的值,如果是基础类型比如int, 直接进行交换: int aToSwap = 1; int bToSwap = 2; 一个经典的问题就是如果我有一个swap 方法如下,试问在主函数里调用了这个swap 方法以后 ,从主函数里传入的两个...
  • 使用函数交换两个数的值。

    千次阅读 2019-04-27 13:59:34
    菜鸟互相学习,大佬多多帮助。下面附上代码。 今天能昨晚的事,绝不拖到明天----苏步青 ...#define _CRT_SECURE_NO_WARNINGS 1 ... printf("交换之后的两个数是:a = %d,b = %d", a, b); system("pause"); }
  • 两个整数通过函数调用交换其值,然后输出。首先定义一个函数,3个值交换。在主函数函数声明(可省略),调用函数,输入要交换两个
  • C语言之利用函数交换两个数的值

    千次阅读 2018-01-10 20:46:43
    #define _CRT_SECURE_NO_WARNINGS #include void Swap(int *px,int *py) { int tmp = *px; *px = *py; *py = tmp; } int main() { int a = 1; int b = 2; Swap(&a,&b); printf("a = %
  • 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....
  • //需要传指针才能改变实参 void swap1(int* x, int* y) { int temp; temp = *x; *x = *y; ...void swap2(int* x, int* y) { //两个相同的异或为0,任何异或0还是它本身 *x = *x ^ *y; ...
  • 函数交换两个整数的值

    千次阅读 2020-02-08 01:33:47
    交换两个整数的值有很多种方法,不设置临时变量的情况下,可以加减两个数,用异或等·,很不实用,其次有设置临时变量,这个相比较于前面提到的效率高了些,也比较简单,在这里就不讲解了。今天想说的是定义一个函数...
  • 此题的解决思路为:创建一个Swap函数,参数为a和b,函数内部创建一个临时变量tmp,用于交换两个数。 但需要注意的是:函数传参的过程中需要注意,形参是实参的一份临时拷贝,形参的改变不会影响实参,所以此时函数...
  • 交换两个变量的值,容易联想到【两量交换借助中间变量】的方法。 若用函数调用的方式来实现交换,沿用上述思路初步实现如下: #include&lt;stdio.h&gt; void exchange(int,int); void exchange(int one,...
  • 1.(1)引用参数传递的...调用函数前、后都输出这两个变量的值、以确认交换成功。 (2)值参数传递的方式,自定义函数实现对两个变量进行交换交换后的结果放入一个数组来返回;调用后打印数组来确认交换成功 ...
  • 函数实现两个整数的交换

    千次阅读 2019-05-14 21:18:26
    这里主要考察 ...是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操作函数外部的 变量。 ...
  • 使用外部函数交换两个变量的值,一个再简单不过的事情,但是在C/C++中,正确实现该功能反应了你对指针和引用等重要知识的掌握程度。本文列举了几种常见的写法,其中前三种是错误的,后两种是正确的。第四种使用的是...
  • 题目:C++用指针作函数参数,定义一个函数,并用函数交换两个整型变量的值
  • //问题:编写函数交换2int型指针的值。 //前一是交换指针所存放的存储地址,后一是交换指针所指向的对象的值。 #include using namespace std; void gcd(int *v1,int *v2) {  int temp=*v1; ...
  • 经典例题:交换两个数

    千次阅读 2016-05-26 15:46:47
    题目: 包装一个函数,实现交换两个整数的功能,注意:需要以传参的形式去调用函数; */ # 这道题看上去是不是很简单! 如果不用包装函数很多人立马就能写出下面的函数; int main() { int a = 2;...
  • 本人java新手,最近学java时突然想到用函数交换两个引用指向的对象的问题。虽然用函数交换对象的作用并不是很重要,但是我相信,对于刚学java的同学来说,如果能够了解其中的原理的话,还是能有不少收获的。以下纯属...
  • c语言交换两个数的值的几种方法

    万次阅读 2019-03-23 10:06:08
    //指针变量交换两个数的值,函数内部要交换两个数的值要通过指针交换 { int t = *x; *x = *y; *y = t; } 2.异或法 根据将某个数与另一个数连续与或两次,可得到本身。将两个数进行与或运算,再分别与...
  • Java编写一个函数交换两个变量的值Java函数在传递过程中只能够传值,不能传址。这样,函数的参数在函数内部做任何变化就都不会反映到外部调用者来。所以解决之道就是要找到要交换对象的引用。对于普通的值类型,像...
  • C++用函数交换两个变量的值

    千次阅读 2018-12-23 20:54:52
    #include<iostream> using namespace std; void swap(int *x,int *y)//利用指针 { int temp; temp=*x; *x=*y; *y=temp; } void superswap(int &a,int &b)//通过引用 { ...i...
  • 在java中用函数交换两个变量的值

    千次阅读 2010-07-31 18:11:00
    调用swap函数之后,两个索引号对应的值就已经被交换了。 下面是测试使用的代码。在myeclipse 6.5 中编译通过。   这段代码实现的是数组元素从小到大的排序。   public class Hello ...
  • 如何用传址的方式交换两个数的大小 首先先看第一个程序,用函数调用来解决看似正确实则运行出来的结果是错误的 #define _CRT_SECURE_NO_WARNINGS 1 #include #include #include int JH(int x, int y); int main() ...
  • /*值传递,局部变量a和b的值确实在调用swap0时变化了,当结束时,他们绳命周期结束*/ void swap0(int a, int b) { int tem = a; a = b; b = a; } /*没有初始化指针就开始用,该函数是有问题的*/ void swap1(int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 241,728
精华内容 96,691
关键字:

调用函数交换两个数