精华内容
下载资源
问答
  • 地址传递和值传递的区别
    千次阅读
    2018-08-25 10:10:38

    什么是值传递,地址传递和引用传递?它们有什么不同?这在学校考试,找工作面试中都是常见的问题。它们之间的区别容易搞错,长时间不用也容易忘记。最近又被问到这个问题,想想还是整理一下记下来,也方便以后参考。

    首先,看以下三段代码。

    1. 

    [plain]  view plain  copy




    1. void swap1(int x, int y)    

    2. {  

    3.   int tmp=x;  

    4.   x=y;  

    5.   y=tmp;  

    6.   print(“x=%d, y=%d\n”, x, y);  

    7. }  

    8.   

    9. void main()  

    10. {  

    11.   int a=2,b=7;  

    12.   swap1(a,b) ;  

    13.   printf(“a=%d, b=%d\n”, a, b);  

    14. }  

    输出结果是什么?

    x=7, y=2

    a=2, b=7


    2. 

    [plain]  view plain  copy




    1. void swap2(int *px, int *py)  

    2. {  

    3.   int tmp=*px;  

    4.   *px=*py;  

    5.   *py=tmp;  

    6.   print(“*px=%d, *py=%d\n”, *px, *py);  

    7. }  

    8.   

    9. void main()  

    10. {  

    11.   int a=2;  

    12.   int b=7;  

    13.   swap2(&a,&b);  

    14.   Print(“a=%d, b=%d\n”, a, b);  

    15. }  

    这次输出结果是什么?

    *px=7, *py=2

    a=7, b=2


    3. 

    [plain]  view plain  copy




    1. void swap3(int &x, int &y)  

    2. {  

    3.   int tmp=x;  

    4.   x=y;  

    5.   y=tmp;  

    6.   print(“x=%d, y=%d\n”, x, y);  

    7. }  

    8.   

    9. void main()  

    10. {  

    11.   int a=2;  

    12.   int b=7;  

    13.   swap3(a,b);  

    14.   Print(“a=%d, b=%d\n”, a, b);  

    15. }  

    那这次输出结果又是什么?


    x=7, y=2

    a=7, b=2


    接下来,分析一下为什么是这样的结果呢?

    上面的1,2,3分别是值传递,地址传递,和引用传递。

    先看值传递。swap1函数的操作是将x,y进行对调。需要注意的是,对形参的操作不会影响到a,b。我们可以设想,在swap1函数执行语句的最前面,隐含地存在x=a; y=b;这两条语句,这样就便于理解了。当a,b把值赋给x,y之后,对x,y不论再做什么操作,都不会影响到a,b本身。


    再看地址传递。注意,这时的函数的声明和调用的写法与值传递不同。

    函数声明:swap2(int *px, int *py)

    函数调用:swap2(&a, &b)

    但是与值传递的分析一样,我们同样可以设想,在swap2函数里,隐含地存在px=&a; py=&b;这两条语句,这表示a的地址代入到了px,b的地址代入到了py。这样一来,对*px, *py的操作就是a,b本身的操作。所以a,b的值被对调了。


    接下来看引用传递。先看函数的声明和调用的写法,函数调用和值传递的写法是一样的,但是函数声明是不一样的。

    函数声明:swap3(int &x, int &y)

    函数调用:swap3(a, b)

    因为定义的x,y前面有&取地址符,调用函数swap3时,a,b分别代替了x,y,即x,y分别引用了a,b变量。因此,函数里的操作,实际上是对实参a,b本身的操作,其值发生了对调。


    更多相关内容
  • 主要介绍了详解java的值传递地址传递、引用传递的相关资料,需要的朋友可以参考下
  • 在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,本文就对C语言地址传递与值传递进行了简单介绍。
  • 主要介绍了Python中 传递值 与 传递引用 的区别解析,非常不错,具有参考借鉴价值,需要的朋友参考下吧
  • 值传递地址传递

    2020-12-22 14:34:37
    1,首先我们要知道在直接输出数组...2,①值传递(pass by value)是指在调用函数时将实际参数复制 一份传递到函数中,这样在函数中如果对 参数 进行修改,将不会影响到实际参数。 因为是对值的直接传递,那么在大量数
  • 另一方面,值传递由于形参实参内存地址不一样,有些功能并不能实现(swap()),因此,除了极为简单的函数会使用值传递外,大多数会采用引用传递。而对于指针传递,则在涉及数组的情况下使用较多,因为指针本身会给...
  • 主要介绍了javascript数组与php数组的地址传递及值传递用法,实例分析了javascript与php的数组使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 值传递和地址传递

    2022-03-22 10:34:04
    原始类型与引用类型的区别

    值传递:当函数参数为直接量、基本类变量时,js采用值传递方式,即实参将变量的值传递给形参,当在函数内对形参的值进行了修改,并不影响实参的值。

    地址传递:当函数参数为数组、对象时,将采用地址传递地址的方式,即在调用函数并传递参数时,将实参变量对应的地址传递给形参变量,函数会根据地址去参数赋值。由于形参变量的地址相同,即指向同一个变量,因此,当形参的值发生变时,实参也会跟着改变。

    变量的本质就是 空间地址
    基本类型(值类型、原始类型)的数据: 是存储在栈空间中的,在栈空间中存储 ‘值本身’
    引用类型的数据: 开辟两块空间,在栈空间中存储的是 ‘堆空间的地址’,在堆空间存储的是值 
    在js中,一个变量赋值给另外一个变量都是副本赋值,赋值是将这个变量在栈空间中存储的“内容”复制一份进行赋值

    原始类型与引用类型的区别
    1.赋值:原始类型赋【值】;引用类型赋【引用】
    2.比较:原始类型比较的是值是否相等;引用类型比较的是【引用】是否指向相同的对象
    3.函数传参:原始类型作为参数,函数内的操作不影响实参的值;应用类型作为参数,函数内的操作会影响实参的值

    原始类型与引用类型的案例示范:

    展开全文
  • C++ 值传递和地址传递的区别

    千次阅读 2021-08-20 16:42:04
    概念解释1.1值传递:1.2指针传递:2.代码案例2.1值传递 1.概念解释 1.1值传递: 形参是实参的拷贝,在外部某个函数中改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值**传递是单向的(实参->形参...

    C++ 值传递和地址传递的区别

    1.概念解释

    1.1值传递:

    形参是实参的拷贝,在外部某个函数中改变形参的值并不会影响主函数内的数据。从被调用函数的角度来说,值**传递是单向的(实参->形参),参数的值只能传入,不能传出**,当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。但是当数据量很大,某个函数只用其中的一部分的时候是不可取的,因为它会把整份数据都拷贝过来。

    1.2指针传递:

    形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作,函数传递的时候只传入一个指针占用四个字节的空间。但是在函数中数据外部数据也会发生改变。

    2.代码案例

    #include<iostream>
    using namespace std;
    
    //定义结构体与创建结构体变量
    struct Student
    {
    	string name;
    	int age;
    };
    
    // 采用值传递的方式改变结构体变量与输出
    void printStudent1(Student p) {
    	p.age = 18;
    	cout << "采用值传递的方式:" << " 姓名:" << p.name << " 年龄: " << p.age << endl;
    }
    // 采用地址的方式改变结构体变量与输出
    void printStudent2(Student *p) {
    	p->age = 18;
    	cout << "采用地址传递的方式:" << " 姓名:" << p->name << " 年龄: " << p->age << endl;
    }
    int main()
    {
    	Student s = { "张三",15 };
    	printStudent1(s);
    	cout << "源结构体的变量:" << " 姓名:" << s.name << " 年龄: " << s.age << endl;
    	printStudent2(&s);
    	cout << "源结构体的变量:" << " 姓名:" << s.name << " 年龄: " << s.age << endl;
    	system("pause");
    	return 0;
    }
    

    结果如下:
    可以理解为值传递的时候函数把源数据传递给了新变量,而函数中的更改都是对新变量的操作
    指针传递是在函数中传递了指向源数据的指针,函数中的数据都是对源数据的操作
    在这里插入图片描述
    如果指针传递的时候防止误修改可使用const修饰

    void printStudent2( const Student *p) {
    	p->age = 18;
    	cout << "采用地址传递的方式:" << " 姓名:" << p->name << " 年龄: " << p->age << endl;
    }
    

    这时候如果在程序中修改程序会报错
    在这里插入图片描述

    展开全文
  • 主要介绍了Java中值传递和引用传递区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 为什么Java只有值传递

    2021-01-20 02:08:46
    我们先看一下值传递和引用传递的概念和区别 值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传递:是指在调用函数时将实际参数的地址直接...
  • 详细解读C语言参数传递-值传递和地址(指针)传递区分

    指针变量作为函数参数 -值传递和地址传递区分

    参考谭浩强版本C语言,本书对于函数的参数传递方式一共就介绍了两种:值传递和地址传递
    P224页:
    从此页开始介绍指针变量作为函数的参数的情况,在这之前,本书的参数传递方式是值传递,也就是参数不涉及到所谓的指针类型,一般函数参数都是变量:

    void add(int a,int b);//参数a b都是int类型的变量,不是指针类型,判断为值传递;
    

    何为值传递? 先给大家分析一下值传递:

    请大家看一下代码:

    1.	void swap1(int x,int y)
    2.	{
    3.		int temp;
    4.		temp = x;
    5.		x = y;
    6.		y = temp;
    7.		printf("x = %d,y = %d\n",x,y);	
    8.	}
    9.	int main() 
    10.	{
    11.		int a = 12,b = 24;
    12.    swap1(a,b); // 值传递 
    13.    printf("a = %d b = %d",a,b);
    14.	}
    
    
    

    结果如图所示:
    在这里插入图片描述

    分析:

    首选我们都知道main实际上也是一个函数,它的作用范围是 第10行-第14行
    swap1也是一个函数,它的作用范围是1-8行
    main函数中的变量与swap函数区域中的变量互不冲突的:
    程序未执行前:
    在这里插入图片描述
    当程序执行到第12行时候:
    main函数中的变量a把12这个int型数据赋值给swa1中的变量x(变量b对y也是同理),之后后续的在swap1函数中的操作,全是针对swap1函数中的变量x和变量y进行的,与Main函数中的变量a和p没有关系了! ,a和b仅仅起到了赋值的作用!! ! !

    在这里插入图片描述
    所以swap1中的x和y的交换,实际上是swap1函数中的x和y交换,与main函数中的变量a和b没有关系,而且我们是在main函数中的是 printf(“a = %d b = %d”,a,b); ,当然要输出的是main函数中的变量a和b,

    何为地址传递?

    在前面一和二章节的基础之上,我们分析下面的例子:

    1.void swap2(int* x,int* y)
    2.{
    3.	int temp;
    4.	temp = *x;
    5.	*x = *y;
    6.	*y = temp;
    7.	printf("x = %d y = %d\n",*x,*y);
    8.}
    9.int main(int argc, char *argv[]) 
    10.{
    11.	int a = 12,b = 24;
    12.	swap2(&a,&b); //地址传递
    13.	printf("a = %d b = %d",a,b); 
    14.}
    
    
    **
    

    1.程序未执行前的状态:

    这一次我们标注好了Main函数中变量a和变量b的地址,(下面那个打错了,应该是swap2的函数作用区域在这里插入图片描述

    .
    2. 当程序执行到第12行时候:由于&a和&b代表的是地址,即参数是地址,程序执行的是地址传递的方式,地址传递不同于值传递,此刻的变量a和变量b会把自己的地址传递给变量x和变量y:
    在这里插入图片描述
    3.那么后续中对swap2函数中的操作:

    1.void swap2(int* x,int* y)
    2.{
    3.	int temp;
    4.	temp = *x;// *是代表把指针变量x所存储地址(x当中存储的是2000  也就是main函数中变量a的地址) 的对应内容(地址2000(即变量a的地址)对应的内容是12)交给temp;
    5.	*x = *y;//   把指针变量y存储的地址   对应的内容 交给  指针变量x存储的地址  对应的空间
    6.	*y = temp;//同上理
    7.	printf("x = %d y = %d\n",*x,*y);
    8.}
    

    这样实际上在swap2函数中对地址的操作,实际上是在对main函数中的变量内容进行操作,所以最后的结果为:
    在这里插入图片描述

    更多C语言的注意事项,请大家关注这个文章~,我会不断更新:

    C语言程序设计(谭浩强版本)-考研版注意事项-适合考研和C语言入门小白食用

    有喜欢算法的小伙伴可以一起关注算法~:

    牛客网-面试必刷100题

    感谢大家的支持~

    展开全文
  • C语言函数传递方式-值传递和地址传递

    千次阅读 多人点赞 2020-03-02 12:10:20
    C语言函数传递方式 值传递 定义 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。 地址传递
  • 值传递和引用传递(地址传递)的区别

    千次阅读 2019-08-07 10:38:05
    值传递和引用传递(地址传递)的区别 也许大家对于被值传递和引用传递(看了些别人的博客也有人说只有值传递)弄得傻傻分不清楚,我个人之前也是这样过来的,自己也思考了一番,后来才弄清楚了,结合大多数人的想法...
  • 首先我们来看下什么是值传递 package com.aozhi.test; //示例一:值传递 基本数据类型都是值传递,因为他们都存在栈里边 public class ValueDemo { public static void main(String[] args) { int x = 10; ...
  • 值传递 当函数被调用的时候,形参被创建,调用时带的参数被拷贝到刚创建好的...值传递的缺点: 当函数被多次调用,值传递结构体类会带来性能上的损害(耗时),给调用者返回值只能通过被调用函数的返回值。 ...
  • 这种方式使用变量、常量、数组元素作为函数参数,实际是将实参的值复制到形参相应的存储单元中,即形参实参分别占用不同的存储单元,这种传递方式称为“参数的值传递”或者“函数的传值调用”。 值传递的特点是...
  • 1.值传递(只传送值,实参不做改变) 2.地址传递(传送地址,实参被改变) # include <stdio.h> void swap(int, int); int main(void) { int x = 10, y = 20; printf("(1)x=%d y=%d\n", x, y); swap(x...
  • Python 值传递地址传递总结

    千次阅读 2021-01-29 10:38:02
    首先我们复习一下什么叫做值传递,什么叫做地址传递 1.值传递 在实参向形参传递的过程中,传递的只是实参的值,而在函数体操作的时候,实际操作的并不是实参而是形参,所以,值传递不改变原变量值 2.地址传递 在实参...
  • 值传递 值传递的实质 将实参的值(a、b)复制到形参(m、n)相应的存储单元中,即形参实参分别占用不同的存储单元。 值传递的特点 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的...
  • 详述值传递和地址传递

    千次阅读 2020-08-06 17:49:29
    值传递和地址传递用到了栈与堆的知识。 我们来看一部分代码示例; 从图中我们可以看出值传递是不会改变a的值,虽然将a的值赋值给了b,但是b的修改不会影响a的内容。 对于地址传递,假设有数组array与ages,将array...
  • 要知道什么是**值传递****地址传递**,首先要知道什么是**基本数据类型****引用类型**。 Java的基本数据类型就八种(除了这八种之外都是引用类型): ◆整型:byte(8位) short(16位) int(32位) long(64位); ...
  • 通俗的来说,值传递只是把变量的值当做参数传递进子函数中,无论函数体中如何改变参数值,主函数的变量值都不会改变。 而地址传递,是把变量的地址传入子函数中,子函数中对于参数的改变,是通过传入的地址参数去...
  • 大多数人都知道,使用值传递对形参的更改不会影响实参,但是地址传递引用传递却会, 最经典的例子莫过于交换两个数字。 但是,为什么在使用值传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只...
  • 以经典的交换变量函数 swap(a,b) 为例,说明地址传递与值传递区别值传递:函数的形参变量与实参变量,是两个完全无关的变量,函数在被调用时,创建形参,将实参的值复制过来(替身)。形参本身在函数调用...
  • C语言指针值传递和地址传递

    千次阅读 多人点赞 2020-07-05 21:08:32
    C语言传参分为值传传递和地址传递。C语言指针传参时,可以通过指针引用方式改变指针指向的值。改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式。 C语言值传递: 形参是实参的拷贝,改变形参的...
  • C++ 值传递和地址传递和引用传递

    千次阅读 多人点赞 2020-02-19 17:50:24
    C++ 值传递和地址传递 在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下: 在数据传递时,分为值传递和地址传递; 值传递:在函数调用时实参将...
  • 主要介绍了JS引用传递与值传递区别与用法,结合实例形式较为详细的对比分析了javascript引用传递与值传递的原理、区别、使用方法及相关操作注意事项,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,961,758
精华内容 784,703
热门标签
关键字:

地址传递和值传递的区别