精华内容
下载资源
问答
  • 在C语言中,所有非数组形式的数据实参都是以值传递的形式调用,本文就对C语言地址传递与值传递进行了简单介绍。
  • java中的参数传递(只有值传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。 java中的数据类型 Java中...

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。

    java中的数据类型

    Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存的值是引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress。

    引用类型包括:类、接口类型和数组。

    java中只有值传递

    在日常编码中,会经常看到如下现象:

    1、对于基本类型参数,在方法体内对参数进行重新赋值,不会改变原有变量的值。

    2、对于引用类型参数,在方法体内对参数进行重新赋予引用,不会改变原有变量所持有的引用。

    3、方法体内对参数进行运算,不会改变原有变量的值。

    4、对于引用类型参数,方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。

    举个例子:

    public class Main {
    
        private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){
    
            b = true;
    
            boo = new Boolean(true);
    
            arr[0] = true;
    
        }
    
           //测试
    
        public static void main(String[] args) {
    
            boolean b = false;
    
            Boolean boo = new Boolean(false);
    
            Boolean[] arr = new Boolean[]{false};
    
            getMiddleOne(b, boo, arr);
    
            System.out.println(b);
    
            System.out.println(boo.toString());
    
            System.out.println(arr[0]);
    
            /**
    
            * output:
    
            * false
    
            * false
    
            * true
    
            */
    
        }
    
    }

    我们只要了解了下面两点就可以解答上面的现象了:

    1、基本数据类型的值就是数值本身,所以示例中的b的值就是false;包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;数组是引用类型,所以arr的值就是指向该Boolean[]的引用。

    2、java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。

    通过上面两点就可以清楚了,getMiddleOne方法中执行的 b=true 和 boo = new Boolean(true) 都是把新值赋给了他们的拷贝,所以不改变原变量的值;同样,arr[0] = true 是把true复制给了arr的拷贝所指向的数组的第一个元素,arr的值和arr的拷贝的值都是该数组的引用,所以arr的拷贝所指向的数组和arr所指向的数组是同一个,所以改变arr的拷贝的数组的元素会同样影响到原变量arr。

    总结

    java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。

     

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

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

    首先,看以下三段代码。

    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本身的操作,其值发生了对调。


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

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

    C语言函数传递方式

    值传递

    定义

    • 所谓的值传递,顾名思义就是使用变量、常量、数组等作为函数的参数。实际是将实参的值复制到形参相应的存储单元中,即形参和实参分别占用不同的存储单元。

    特点

    • 值传递的特点是单向传递,即主调函数被调用时给形参分配存储单元,把实参的值传递给形参,在调用结束后,形参的存储单元被释放,而形参值的任何变化都不会影响到实参的值,实参的存储单元仍保留并维持数值不变。

    示意图

    值传递示意图
    其实值传递过程中由隐含的一步,如下代码所示:

    	int x = a;
    	int y = b; 
    

    所以swap1函数交换的是x和y,而原来的a和b从未改变。

    代码演示

    void swap1(int x,int y)
    {
    	int temp;
    	temp = x;
    	x = y;
    	y = temp;
    	printf("x = %d,y = %d\n",x,y);	
    }
    int main(int argc, char *argv[]) 
    {
    	int a = 12,b = 24;
        swap1(a,b); // 值传递 
        printf("a = %d b = %d",a,b);
    }
    
    

    运行结果

    值传递运行结果


    地址传递

    说明

    • 大家都知道,在C语言中,数组名就代表数组的首地址。所谓的地址传递,指的就是函数的参数是数组名或者指针。传递的是数组的首地址或指针的值,而形参接收到的是地址,即指向实参的存储单元,形参和实参占用相同的存储单元,即形参和实参是相同的。

    特点

    • 形参并不存在存储空间,编译系统不为形参数组分配内存。因此在数组名或指针作函数参数时所进行的传送只是地址传送,形参在取得该地址之后,与实参共同拥有一段内存空间,形参的变化也就是实参的变化。

    示意图

    地址传递示意图
    注意:这里也有一个隐含动作,如下代码所示:

    	x = &a;
    	y = &b;
    

    分别将a的地址,b的地址赋值给x和y,这样swap2函数操作的数其实就是a和b。

    代码演示

    void swap2(int* x,int* y)
    {
    	int temp;
    	temp = *x;
    	*x = *y;
    	*y = temp;
    	printf("x = %d y = %d\n",*x,*y);
    }
    int main(int argc, char *argv[]) 
    {
    	int a = 12,b = 24;
    	swap2(&a,&b); //地址传递
    	printf("a = %d b = %d",a,b); 
    }
    

    运行结果

    地址传递运行结果
    以上就是C语言值传递和地址传递的区别了,相信大家应该很清楚了吧!

    展开全文
  • C++ 值传递和地址传递 在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下: 在数据传递时,分为值传递和地址传递; 值传递:在函数调用时实参将...

    C++ 值传递和地址传递和引用传递

    在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下:
    在数据传递时,分为值传递和地址传递;

    值传递:在函数调用时实参将数据传入形参

    #include<iostream>
    #include<string>
    using namespace std;
    void swap(int x, int y) 
    {
    	int temp=0;
    	temp = x;
    	x = y;
    	y = temp;
    	cout << "x=" << x << "   " << "y=" << y << endl;
    }
    int main()
    {
    
    	int x = 5;
    	int y = 6;
    	cout <<"原始数值为:"<< "x=" << x << "   " << "y=" << y << endl;
    	swap(x,y);
    	cout <<"在main函数中使用swap函数后的数值为:"<< "x="<<x<<"   "<<"y="<<y << endl;
    	return 0;
    }
    

    运行结果为:
    在这里插入图片描述
    结果显示,在swap函数中数据显示确进行了交换,但是在main函数中调用函数后显示,两个数据依然是和原始数据一样。
    这是为什么呢?
    因为在x,y 给swap传递参数的时候仅仅把数值传递给了形参,函数内的数据的交换,对函数意外的数据结果不起任何的影响,
    即:在进行值传递时,函数的形参数据的变化不会改变实参的数据
    那么如何才能让函数中的形参的修改的同时,实参也发生变化呢?这时候就需要用到地址传递或者引用传递。

    地址传递:将实参的地址传递给函数的形参

    #include<iostream>
    using namespace std;
    
    void swap(int * p1, int * p2)
    {
    	int temp;
    	temp = *p1;
    	*p1 = *p2;
    	*p2 = temp;
    }
    int main()
    {
    	int a = 10;
    	int b = 20;
    	swap(&a,&b);
    	cout <<"a=" << a << "   " << "b=" << b << endl;
    
    	return 0;
    }
    

    结果为:
    在这里插入图片描述
    此时结果显示,在main中的实参确实发生了变化,这是因为函数的参数为两个指针,此时传递进去的已经不是数据了而是两个数据的内存地址,是在地址上进行的数据的交换,既然地址上的数据发生了变化,两个地址又分别对应实参a和b,即a和b的数据发生了变化。

    引用传递:利用引用用形参修饰实参

    形式:数据类型 &变量名 = 变量名
    例如:

    int a =10;
    int &b = a;//这是变量a被b引用,即a和b指向同一块内存
    

    参数传递程序:

    #include<iostream>
    #include<string>
    using namespace std;
    
    void swap(int &x,int &y) 
    {
    	int temp;
    	temp = x;
    	x = y;
    	y = temp;
    
    }
    
    int main()
    {
    	int a = 10;
    	int b = 20;
    
    	swap(a,b);
    
    	cout << "a=" << a << endl;
    	cout << "b=" << b << endl;
    
    	return 0;
    }
    

    结果:
    在这里插入图片描述
    结果显示,用引用传递可以用形参修饰实参

    引用注意事项:
      引用必须初始化
      引用在初始化后不可再改变

    引用

    引用的本质就是在C++内部实现一个指针常量,
    例如:
      int &ref = a; 编译器内部会自动转化为:int * const ref = &a; 这也解释了为什么引用一旦初始化不能再改变。

    常量引用:
      作用:const 修饰引用后,引用的数值不可再修改
    注意:

    int & ref = 10;//这样写是错误的,因为引用必须是一个合法的地址
    const int & ref = 10;//这样写是正确的,加上const后,编译器将代码修改为 int temp = 10; int & ref = temp;
    
    展开全文
  • 值传递和引用传递(地址传递)的区别

    千次阅读 2019-08-07 10:38:05
    值传递和引用传递(地址传递)的区别 也许大家对于被值传递和引用传递(看了些别人的博客也有人说只有值传递)弄得傻傻分不清楚,我个人之前也是这样过来的,自己也思考了一番,后来才弄清楚了,结合大多数人的想法...
  • C语言地址传递和值传递简析

    千次阅读 2009-12-09 21:37:00
    不少同学在学到C语言的指针部分时感到很困惑,对经常提到的“值传递地址传递”两个概念弄不明白。实际上,因为地址本身也可以作为一个特殊的“值”,所以地址传递也是一种特殊的值传递。只是为了强调其特殊性...
  • 主要介绍了javascript数组与php数组的地址传递及值传递用法,实例分析了javascript与php的数组使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 3个数从大到小排序用地址传递和值传递(指针) 三个数从大到小分别用地址传递和值传递(指针)
  • 主要介绍了详解java的值传递地址传递、引用传递的相关资料,需要的朋友可以参考下
  • 值传递地址传递引用传递

    千次阅读 多人点赞 2014-08-27 20:51:32
    什么是值传递地址传递引用传递?
  • 大多数人都知道,使用值传递对形参的更改不会影响实参,但是地址传递引用传递却会, 最经典的例子莫过于交换两个数字。 但是,为什么在使用值传递的时候,传递一个地址给行参依然没有影响到实参了,是因为改变只...
  • 首先我们复习一下什么叫做值传递,什么叫做地址传递 1.值传递 在实参向形参传递的过程中,传递的只是实参的值,而在函数体操作的时候,实际操作的并不是实参而是形参,所以,值传递不改变原变量值 2.地址传递 在实参...
  • 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...
  • 函数的参数之地址传递与值传递区别 #include<iostream> using namespace std; //值传递,相当于此函数为值交换,实参将数值传递给了形参,虽然形参与实参同名,但是实际是不同的地址,因此交换的是形参的值...
  • 通俗的来说,值传递只是把变量的值当做参数传递进子函数中,无论函数体中如何改变参数值,主函数的变量值都不会改变。 而地址传递,是把变量的地址传入子函数中,子函数中对于参数的改变,是通过传入的地址参数去...
  • 很详细总结了两者的区别,保证让你看完不会再不懂的其中的区别
  • C语言值传递 地址传递 引用传递

    万次阅读 多人点赞 2013-09-15 10:47:00
    C语言值传递 地址传递 引用传递: 1.值传递 eg: void Exchg1(int x, int y) { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1
  • C语言指针值传递和地址传递

    千次阅读 2020-07-05 21:08:32
    C语言传参分为值传传递和地址传递。C语言指针传参时,可以通过指针引用方式改变指针指向的值。改变变量,可以使用指针应用方式,改变地址,使用指针的指针引用方式。 C语言值传递: 形参是实参的拷贝,改变形参的...
  • 主要介绍了Python中 传递值 与 传递引用 的区别解析,非常不错,具有参考借鉴价值,需要的朋友参考下吧
  • 引用传递和值传递区别

    千次阅读 2019-03-05 13:31:29
    1. 引用传递和值传递区别 答:(1)按值传递不会改变实际参数的数值; (2)按引用传递可以改变实际参数的内容,但不能改变实际参数的参考地址。 例如: public class Test{ public static void main(String[] ...
  • 我觉得只要明白了值传递和地址传递,就应该能明白形参和实参的具体工作细节了。 1、值传递  实参是变量,表达式等值。  find(int x){}  y= find(z);  上面的例子中,z是实参,x是形参。x变z不变。  在...
  • 给函数赋值都是值传递值传递只是把值传给函数中某一元素,但2者是2块不同的内存空间,函数中值的变化在出了大括号后会被系统回收,故不会影响函数体外值的变化。 只有数组的函数赋值是引用传递,引用传递也叫地址...
  • 在我们学习C语言函数部分的时候,书上写的实参向形参的数据传递是‘值传递’,是单向传递,只能由实参传递给形参,而不能由形参传递给实参。由于这个特性,我们可能在写程序时,有些函数内改变了一些值,运行结果会...
  • 首先我们来看下什么是值传递 package com.aozhi.test; //示例一:值传递 基本数据类型都是值传递,因为他们都存在栈里边 public class ValueDemo { public static void main(String[] args) { int x = 10; ...
  • 值传递和引用传递的区别

    千次阅读 2018-07-19 21:13:00
    值传递是指基本数据类型在方法中的传递,引用传递是指引用数据类型在方法中的传递,举例来说,如下图程序代码运行所示: 注:int属于基本数据类型,因此在方法中进行传递引用时,并不会改变该变量的数值 而arr...
  • 值传递地址传递引用传递

    千次阅读 2018-08-10 15:50:28
    值传递 [plain] view plain copy void swap1(int x, int y) { int tmp=x; x=y; y=tmp; print(“x=%d, y=%d\n”, x, y); } void main() { int a=2,b=7; swap1(a,b) ; printf(“a=%d, b=%d\n...
  • 结构体的值传递和地址传递

    千次阅读 2019-06-28 15:47:51
    结构体的值传递和地址传递 代码为: #include<stdio.h> #include<string.h> struct Student { int age; char name[50]; int score; }; void chstrStu1(struct Student st1) { st1.age = 20; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,723,577
精华内容 689,430
关键字:

地址传递和值传递的区别