精华内容
下载资源
问答
  • 自己写了一个Swap测试类,代码如下: ``` public class Swap5 ... public static void main(String[] args) ...用字面值方式给字符串赋值是生成在String Pool(字符串池)...应该是生成在堆中,为什么交换不了呢?
  • 多说 直接来个正文~ ————————————下面是正文—————————————— 如果此时需要你来编写一个函数 需求是传进两个参数,对传进来参数进行数值交换,大多数人可能会写出以下的代码: #...

    话不多说

    直接来个正文~

    ————————————下面是正文——————————————

    如果此时需要你来编写一个函数

    需求是传进两个参数,对传进来参数进行数值交换,大多数人可能会写出以下的代码:

    #include <iostream>
    
    using namespace std; 
    
    void swap(int x,int y)
    {
    	int temp;
    	temp = x;
    	x = y;
    	y = temp;
    }
    
    void main()
    {
    	int x,y;
    	x = 5;
    	y = 6;
    	swap(x,y);
    	cout<<"x="<<x<<" "<<"y="<<y<<endl;
    } 
    

    编译的结果却不如我们所料:

    很明显,传进去的参数并没有进行交换,这是为什么呢?

    我们可以从函数中进行交换部分的汇编,来了解个中的原由:

            从上图可以看到,在执行第一次数据交换时,是先将寄存器“ebp - 8”里面所储存的内容传送到寄存器 “eax”,而寄存器 “ebp-8” 所储存的内容如下图所示:

    第二段汇编指令和上一段的含义相差不大:

    所以,寄存器“ebp - 4” 里面所存储的内容如下:

            如此,代码 Temp = x 便实行了数据的交换,以下交换过程由于和这段基本一致,就不再赘述。在整个数据交换的过程中,有个很明显的点需要各位同学的注意,就是交换的数据并不是交换了变量的值,而是交换了 “ 复制 ” 过来的数据,具体交换过程可以参考以下的图示。

    而这种单纯将数据复制过来的传递,有个专业的名词:按值传递

    而如果需要对传进来的参数进行交换,则需要将参数的指针传进交换函数中:

    #include <iostream>
    
    using namespace std; 
    
    void swap(int* x,int* y)
    {
    	int* temp;
    	temp = x;
    	x = y;
    	y = temp;
    }
    
    void main()
    {
    	int x,y;
    	x = 5;
    	y = 6;
    	swap(x,y);
    	cout<<"x="<<x<<" "<<"y="<<y<<endl;
    } 
    

    编译的结果如下:

    我们可以通过汇编查看该代码是如何进行交换的:

           和前面第一个交换代码不同的是,该段使用指针的交换函数使用的汇编指令是 lea ,用于将地址赋予寄存器,具体的交换过程可参考以下图示:

    如上所述,通过地址进行交换,并修改目标地址所储存的内容这个过程,称之为 按址传递

    展开全文
  • Java值传递之swap()方法不能交换

    千次阅读 2017-04-04 10:50:54
    为什么调用swap()方法后并没有交换c、d的值呢,因为java只有值传递(没有引用传递),所以其实调用swap()时是把值赋给a、b,赋完后与c、d就没什么关系,c、d还是原来的值。其实就是值传递理解的话回去看看值传递...

    自己写了一个Swap测试类,代码如下:

    swap不能交换原生数据类型以及字符串类型。

    public class Swap5
    {
        public static void main(String[] args)
        {
        //  String x = "x111";
        //  String y = "y111";
            String x = new String("x111");
            String y = new String("y111");
            swap(x, y);
            System.out.println(x);
            System.out.println(y);
        }
    
        public static void swap(String a, String b)
        {
            String temp = a;
            a = b;
            b = temp;
        }
    }
    
    运行结果:java Swap5
    x111
    y111

    疑惑:注释部分不能交换可以理解为x和y生成在字符串池中,但是String x = new String(“x111”);应该是生成在堆中,是引用对象,但为什么交换不了?

    public class Swap
    {
        public static void main(String[] args)
        {
            int c = 3;
            int d = 5;
            swap(c, d);
            System.out.println("c: " + c + "  d: " + d);
    
        }
    
        public static void swap(int a, int b)
        {
            int temp = a;
            a = b;
            b = temp;
        }
    }
    

    运行结果:
    java Swap
    c: 3 d: 5

    为什么调用swap()方法后并没有交换c、d的值呢,因为java只有值传递(没有引用传递),所以其实调用swap()时是把值赋给a、b,赋完后与c、d就没什么关系,c、d还是原来的值。其实就是值传递。不理解的话回去看看值传递。


    但是这样用数组改写后便可实现交换功能了:

    public class Swap5
    {
        public static void main(String[] args)
        {
            int[] i = {3, 5};
    
            swap(i);
            System.out.println(i[0]);
            System.out.println(i[1]);
        }
    
        public static void swap(int[] a)
        {
            int temp = a[0];
            a[0] = a[1];
            a[1] = temp;
        }
    }
    

    运行结果:
    5
    3


    总结:引用类型才可以交换。因为原生数据类型是直接赋值,而引用类型直接赋的是地址,地址指向的是同一个对象,所以能改变。

    展开全文
  • 交换两个变量a、b的 代码如下: #include<stdio.h> int main() { void swap1(int p1,int p2); void swap2(int *p1,int *p2); int *p1,*p2,a,b; p1=&a; p2=&b; printf("请输入a、b的:"); ...

    交换两个变量a、b的值
    代码如下:

    #include<stdio.h>
    int main()
    {
    	void swap1(int p1,int p2);
    	void swap2(int *p1,int *p2);
    	int *p1,*p2,a,b;
    	p1=&a;
    	p2=&b;
    	printf("请输入a、b的值:");
     	scanf("%d,%d",&a,&b);
     	printf("a=%d\tb=%d\n",a,b);
     	swap1(a,b); 
     	printf("swap1交换后:a=%d\tb=%d\n",a,b);
     	swap2(p1,p2);
     	printf("swap2交换后:a=%d\tb=%d\n",a,b);
     	return 0;
    }
    //swap1函数 值传递 
    void swap1(int p1,int p2)
    {
    	int temp;
    	temp=p1;
    	p1=p2;
    	p2=temp;
    }
    //swap2函数 地址传递 
    void swap2(int *p1,int *p2)
    {
    	int temp;
    	temp=*p1;
    	*p1=*p2;
    	*p2=temp;
    }
    

    运行结果如下:
    运行结果
    可以看到:

    三个数字排序(自用):

    #include<stdio.h>
    int main()
    {
    	void exchange(int *p1,int *p2,int *p3);
    	int *p1,*p2,*p3,a,b,c;
    	p1=&a;p2=&b;p3=&c;
    	printf("请输入a、b、c的值:");
     	scanf("%d,%d,%d",&a,&b,&c);
     	printf("a=%d\tb=%d\tc=%d\n",a,b,c );
     	exchange(p1,p2,p3);
     	printf("排序后:a=%d\tb=%d\tc=%d\n",a,b,c);
     	return 0;
    }
    void exchange(int *p1,int *p2,int *p3)
    {
    	void swap(int *p1,int *p2);
    	if(*p1<*p2) swap(p1,p2);
    	if(*p1<*p3) swap(p1,p3);
    	if(*p2<*p3) swap(p2,p3);
    }
    void swap(int *p1,int *p2)
    {
    	int temp;
    	temp=*p1;
    	*p1=*p2;
    	*p2=temp;
    }
    
    展开全文
  • python 值传递与址传递

    千次阅读 2019-02-13 21:35:41
    示例一:址传递 def change(a): a[-1] = 0 return a if __name__ == '__main__': a = [1,23] print(change(a)) print(a) 输出结果: ...示例二:值传递 def change(a): a = 0 return a if _...

    对于基础数据类型,如int,float,str,boolean等,是值传递。传递的是数值。

    def change(a):
        a = 0
        return a
    
    if __name__ == '__main__':
        a = 5
        print(change(a))
        print(a)
    

    输出结果:

    0
    5
    

    对于复杂数据类型,如list,dict,set等,是址传递。传递的是引用。

    def change(a):
        a[-1] = 0
        return a
    
    if __name__ == '__main__':
        a = [1,23]
        print(change(a))
        print(a)
    

    输出结果:

    [1, 0]
    [1, 0]
    
    展开全文
  • C语言函数传递方式-值传递和地址传递

    千次阅读 多人点赞 2020-03-02 12:10:20
    C语言函数传递方式 值传递 定义 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。 地址传递
  • import java.util.Scanner;//导入Scanner public class demo1 { public static void main(String[] args) { //值传递和地址传递 ... //值传递:传递的是简单数据类型 在栈当中进行交换 没有...
  • Java基础知识面试题(2020最新版)

    万次阅读 多人点赞 2020-02-19 12:11:27
    文章目录Java概述何为编程什么是Javajdk1.5之后的三大版本JVM、JRE和JDK的关系什么是跨平台性?原理是什么Java语言有哪些特点什么是字节码?采用字节码的最大好处是什么什么是Java程序的主类?应用程序和小程序的...
  • 深入理解--Java按值传递和按引用传递

    万次阅读 多人点赞 2017-07-20 15:48:49
    引言最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路。何乐而不为?Java按...
  • Java 值交换详解

    千次阅读 2016-07-16 17:06:17
    Java中有四种交换方式,分别是基本数据类型 数组,实例对象, String交换 下面我一一举个例子来讲解~ 1.基本数据类型交换 看下面代码: public class Test { public static void main(String[] args) { int a=10;...
  • 说明以下的方法swap为什么无法交换实际参数的。 public static void swap(int x,int y) { int temp =x; x=y; y=temp; } 针对这个问题,我们先做个试验,代码如下: public class Main { public static void ...
  • C++ 值传递和地址传递和引用传递

    千次阅读 多人点赞 2020-02-19 17:50:24
    C++ 值传递和地址传递 在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下: 在数据传递时,分为值传递和地址传递; 值传递:在函数调用时实参将...
  • Java中是引用传递还是值传递

    千次阅读 多人点赞 2016-10-23 00:01:41
    - **值传递:**将方法实际参数值复制到另一个变量,然后复制的对象被传递,这就是为什么它被称为“值传递”- **引用传递:**将实际参数的引用传递给该方法,这就是为什么它被引用称为“传递”的原因。 例子分析1问题:...
  • 1.(1)引用参数传递的方式,自定义函数实现对两个变量进行交换;...(2)参数传递的方式,自定义函数实现对两个变量进行交换交换后的结果放入一个数组来返回;调用后打印数组来确认交换成功 ...
  • 交换两个变量的,容易联想到【两量交换借助中间变量】的方法。 若用函数调用的方式来实现交换,沿用上述思路初步实现如下: #include&lt;stdio.h&gt; void exchange(int,int); void exchange(int one,...
  • 首先明白Java的数据类型分为两种:基本数据类型 和 引用数据类型  ...1)基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语言本身定义,它表示了真实的数字、字符和整数。 2)引用数据类型:...
  • 为什么Java中只有值传递

    千次阅读 2019-06-11 09:24:03
    最开始以为Java有值传递和引用传递,在JavaGuide中看到一个标题为什么Java中只有值传递?写了三个例子,讲述了为什么Java只有值传递。 例子A : public static void main(String[] args) { int i=1; int j=2;...
  • 但是,为什么在使用值传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只在函数内部,没有返回给调用函数吗? 比如,下面关于二叉树的建立和遍历 ``` #include using namespace std; #...
  • Java值传递和引用传递

    千次阅读 2018-08-20 10:35:24
    通过这两天的实习面试,发现自己的基础实在烂的不行,先打算投简历了,安安心心的在家学了几个月,把最基本的东西全部搞懂再说。之前看到别人也在写类似的模块,觉得挺好的,因此我打算每天(也有可能几...值传递 ...
  • C语言指针值传递和地址传递

    千次阅读 2020-07-05 21:08:32
    C语言值传递: 形参是实参的拷贝,改变形参的值并会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参) #include <stdio.h> void swap(int x, int y); main() { int ...
  • 我看好多写三种方式的都把源代码代码贴出来了,也有打印信息,真的不能再真啊!难道打印会骗人?一定是哪里出了鬼了!我要打破沙锅问到底! 排查 经过多次测试验证,最后我发现和编译环境(gcc与g++编译器)有关,...
  • C语言参数传递----值传递与地址传递

    千次阅读 多人点赞 2017-09-15 23:32:58
    最近开始复(yu)习(xi)C语言,看到参数传递这里,又遇到了以前一直没有搞清楚的一个问题,我相信这个问题大家许多初学者也会遇到过,就是C语言函数的参数传递方式。...1)值传递 2)地址传递 3)数组作为函数参数
  • 为什么说java只有值传递

    千次阅读 2018-07-10 15:43:09
    我们来看看上面是值传递和引用传递首先要知道基本数据类型的值以及引用类型的引用是存放在堆中的,引用类型实际的数据是存放在栈中的对于8...对于引用类型为什么说是值传递,我贴个网上看到的代码class Student { ...
  • 为什么我的交换函数起作用?

    千次阅读 2021-01-28 20:34:56
    这是为什么呢?让我们一起来分析一下吧。 一、错误示范 我们初学者会想当然的用形参进行数值交换的操作,下面是演示代码: void Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } int main() {...
  • 首先我们写出一段程序,这段程序用来介绍两种传递方式的区别。include using namespace std; void swap1(int a,int b); void swap2(int* a,int *b); void swap3(int& a,int& b); int main() { int a=2,b=3; swap1...
  • PHP如何交换两个变量的

    千次阅读 2019-05-18 16:43:14
    第二种方法就是使用第三个变量的情况下交换两个变量。 下面我们就通过具体的代码示例,给大家介绍PHP交换两个变量的方法。 首先大家要知道交换两个变量就是指相互交换变量的。通常,这是通过内存中的数据...
  • 若认可本篇博客,希望给一个点赞、收藏 并且,遇到了什么问题,请在评论区留言,我会及时回复的 这本书对Python的知识点的描述很详细,而且排版看的很舒服 几个例题: 假装自己从零开始学,将一些有代表性、有意思的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 191,815
精华内容 76,726
关键字:

值传递为什么不能交换值