精华内容
下载资源
问答
  • 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语言值传递和地址传递的区别了,相信大家应该很清楚了吧!

    展开全文
  • 引用传递:这点比较特殊 传递的还是原来变量,只是变量的别名而已,函数内部修改会直接导致外部改变。 指针传递: 获取到函数外部对象的指针(也就是地址),然后函数里面会根据地址去操作地址下对象的值。 Java中也...

    在 C++  中函数调用的时候,

    1. 值传递: 一般是将源数据复制一份然后 重新操作,变量内存地址都不一样。
    2. 引用传递:这点比较特殊 传递的还是原来变量,只是变量的别名而已,函数内部修改会直接导致外部改变。
    3. 指针传递: 获取到函数外部对象的指针(也就是地址),然后函数里面会根据地址去操作地址下对象的值。

    Java中也类似结论如下(具体讲解):

    1. 在Java里面,当调用方法时,如果传入的数值为基本数据类型(包含String类型),形式参数的改变对实际参数不影响,就是值传递。
    2. 在Java里面,当调用方法时,如果传入的数值为非基本数据类型比如对象(String类型除外),传入的是该对象的地址,然后将该对 象的地址复制给形参,然后操作形参的时候会影响实参,但是切记也是值传递 不过传递的是对象地址

    1. 按值传递(深拷贝 一个一样的值)

    import java.util.Scanner;
    public class learnJava
    {
    	public static void main(String[] args)
    	{
    		int a = 12;
    		fun(a);
    		System.out.println("方法外部对象的A值:" + a);
    	}
    
    	private static void fun(int a)
    	{
    		a += 1;
    		System.out.println("函数内部对象的A值:" + a);
    	}
    }
    ================
    函数内部对象的A值:13
    方法外部对象的A值:12
    
    package mytest;
    
    public class Client
    {
    	public static void main(String[] args)
    	{
    		String a = "12";
    		fun(a);
    		System.out.println("方法外部对象的A值:" + a);
    	}
    
    	private static void fun(String a)
    	{
    		// a = new String("34");
    		a  = a + 34;
    		System.out.println("函数内部对象的A值:" + a);
    	}
    }
    /*
    * String  虽然是对象 但是 可以将其看成基本类型传递 是深拷贝  直接弄了一个value 一样但是地址不相干的对象。
    * 函数内部对象的A值:1234
    * 方法外部对象的A值:12
    * */

    注意:String类型也是引用类型为什么函数调用没有改变外部的原型的值呢?

       这主要是由于String内部保存值方式的原因 String是通过一个final char[] 数组进行保存的  由于final类型的数组值不能够改变,所以在外部调用函数时将String地址的引用进行传递给函数的参数,函数内部再修改这个引用时,由于final char[] 不可修改,所以再给变量赋值新值时都会重新创建一个String实例(这个新创建的String实例所指向的地址和外部string变量所指向的地址是不同的所以改变不了外部的变量)另外一个点说明因为final  String 对象是不可变的,所以可以共享 也就是说 String  op="abc" 和 String op1="abc" 指向的是同一个引用对象(字符串是常量;它们的值在创建之后不能更改 ---jdk Api)

    package mytest;
    import java.util.Scanner;
    public class learnJava
    {
    	public static void main(String[] args)
    	{
    		A a = new A(5);
    		fun(a);
    		System.out.println("方法外部对象的A值:" + a.a);
    	}
    
    	private static void fun(A a)
    	{
    		a.a += 1;
            // a = new A(); 即使这样 原来 fun(a) 调用的地方仍然不会改变。因为是值传递下的 地址传递而已。不是引用传递!!!
    		System.out.println("函数内部对象的A值:" + a.a);
    	}
    
    	static class A
    	{
    		public int a;
    
    		public A(int a)
    		{
    			this.a = a;
    		}
    	}
    }
    
    ===================================
    函数内部对象的A值:6
    方法外部对象的A值:6
    /**
     * 测试参数传值机制
     * @author ljj
     *
     */
    public class User4 {
        int id;        //id
        String name;   //账户名
        String pwd;   //密码
           
        public User4(int id, String name) {
            this.id = id;
            this.name = name;
        }
          
        public   void   testParameterTransfer01(User4  u){
            u.name="高小八";
        }
         
        public   void   testParameterTransfer02(User4  u){
            u  =  new  User4(200,"高三"); 理解在这的操作不会 影响到数据的原始层
        }
          
        public static void main(String[] args) {
            User4   u1  =  new User4(100, "高小七");
             
            u1.testParameterTransfer01(u1); 
            System.out.println(u1.name);
     
            u1.testParameterTransfer02(u1);
            System.out.println(u1.name);
        }
    }

    关于字符串的重点说明:

       java中字符串存在常量池中。 java的内存分为堆,栈,方法区(包括常量池)。 java中字符串存在常量池中。  方法区中主要存在类结构,静态变量。方法区又包含常量池,常量池保存字符串常量。
    String类的概念

       String类是用于字符串相关操作的一个类。

       类包括成员变量和方法。

       (1)String类有一个特殊的成员变量 final char[],保存着常量池中某个字符串的内存地址,也可以理解为一个指针。

       (2)String类有一些方法,如indexOf(),charAt()。String类没有对字符串进行修改的方法

           虽然String类没有修改字符串的方法,但保留字符串地址的成员变量是可以修改的,也就是说String类的对象可以指向另外的字符串。

    String 两种实例化方式解析

    String str= "abc" 创建方式

              创建对象的过程

              1 首先在常量池中查找是否存在内容为"abc"字符串对象

              2 如果不存在则在常量池中创建"abc",并让str引用该对象

              3 如果存在则直接让str引用该对象

    String str= new String("abc")创建方式
              创建对象的过程

             1 首先在堆中(不是常量池)创建一个指定的对象,并让str引用指向该对象。

             2 在字符串常量池中查看,是否存在内容为"abc"字符串对象

             3 若存在,则将new出来的字符串对象与字符串常量池中的对象联系起来(即让那个特殊的成员变量value的指针指向它)

             4 若不存在,则在字符串常量池中创建一个内容为"abc"的字符串对象,并将堆中的对象与之联系起来。(有可能此时常量池中的"abc"已经被回收,所以要先创建一个内容为"abc"的字符串对象)

     

    展开全文
  • 三种C++函数传递方式

    2019-01-23 09:57:24
    C++函数调用方式有三种: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) 一.按值传递(pass by value) 把实参内容复制到形参,实参和形参存放在两个不同内存空间。函数...

    C++函数调用方式有三种:

    • 按值传递(pass by value)
    • 地址传递(pass by pointer)
    • 引用传递(pass by reference)

    一.按值传递(pass by value)

    • 把实参内容复制到形参,实参和形参存放在两个不同内存空间。函数体内对形参的一切修改对实参没影响
    • 如果形参是类的对象,利用值传递的话每次都要调用类的构造函数构造对象,效率比较低
      /*
       pass by value
       实参值不发生改变
      */
      #include<iostream>
      using namespace std;
      
      void swap(int, int);
      int main()
      {
      	int a = 3, b = 4;
      	cout << "a1= " << a << ", b1= " << b << endl;
      	swap(a, b);
      	cout << "a2= " << a << ", b2 = " << b << endl;
      	system("pause");
      	return 0;
      }
      void swap(int x, int y)
      {
      	int t = x;
      	x = y;
      	y = t;
      }

      输出结果:

    二.地址传递(pass by pointer)

    • 进行指针传递的时候,形参是指针变量,实参是一个变量的地址或者是指针变量,调用函数的时候,形参指向实参的地址。
    • 指针传递中,函数体内可以通过形参指针改变实参地址空间的内容。
    /*
    pass by address
    实参的值发生改变
    */
    #include<iostream>
    using namespace std;
    void swap(int*, int*);
    int main()
    {
    	int a = 3, b = 4;
    	cout << "a1=" << a << " b1= " << b << endl;
    	cout << "实参变量a1的地址= " << &a << endl;
    	cout << "实参变量b1的地址= " << &b << endl;
    	swap(&a, &b);
    	cout << "a2=" << a << " b2= " << b << endl;
    	cout << "实参变量a2的地址= " << &a << endl;
    	cout << "实参变量b2的地址= " << &b << endl;
    	system("pause");
    	return 0;
    }
    void swap(int *x, int *y)
    {
    	cout << "变量x1的地址= " << x << endl;
    	cout << "变量y1的地址= " << y << endl;
    	int t = *x;
    	*x = *y;
    	*y = t;
    	cout << "变量x2的地址= " << x << endl;
    	cout << "变量y2的地址= " << y << endl;
    }

    输出结果:

    理解是:实参变量地址传递到形参,形参操作过程地址不变,只是存储在地址里面的值发生互换操作。

    三.引用传递(pass by reference)

    • 引用实际上是某一个变量的别名,和这个变量具有相同的内存空间。
    • 实参把变量传递给形参引用,相当于形参是实参变量的别名,对形参的修改都是直接修改实参。
    • 在类的成员函数中经常用到类的引用对象作为形参,大大的提高代码的效率
    /*
    pass by reference
    实参的值发生改变
    */
    #include<iostream>
    using namespace std;
    void swap(int&, int&);
    
    int main()
    {
    	int a = 3, b = 4;
    	cout << "a1=" << a << " b1=" << b << endl;
    	swap(a, b);
    	cout << "a2= " << a << " b2=" << b << endl;
    	system("pause");
    	return 0;
    }
    
    void swap(int&x, int&y)
    {
    	int t = x;
    	x = y;
    	y = t;
    }

    输出结果:

     

    展开全文
  • C 函数传递方式

    2014-09-27 22:17:53
    1、值传递 2、地址传递 #include //函数声明:返回类型 函数名(参数列表) //函数实现  int power(int di,int zhi)//形参  { int result = 1; int i = 0; for(;i { result *= di; } /...

    1、值传递

    2、地址传递

    (例子)

    #include <stdio.h>
    //值传递 
    void function1(int a)
    {
    a++;
    printf("函数内:%d\n",a);
    }
    //地址传递 
    void function2(int a[])
    {
    a[0]++;
    printf("函数内:%d\n",a[0]);

    void main()
    {
    int num = 10;
    function1(num);
    printf("调用后:%d\n",num);


    int num[1] = {10};
    function2(num);
    printf("调用后:%d\n",num[0]);
    }




    展开全文
  • 三种函数传递方式

    2017-09-13 10:12:10
    /*  ... *All rights reserved.... *文件名称:  *作 者:刘思源 ...*问题描述:两种函数传递方式:传值和传地址  *输入描述:两个整数,代表交换前的值  *程序输出:两个整数,代表交换后的值  */  #i
  • cpp函数传递值的三种方式

    千次阅读 2017-12-08 08:50:40
    0x00 函数传递值的三种方式.../* 通过解析mysql 的查询函数,来理解函数传递方式 const char *query 地址传递 unsigned long length */ int mysql_real_query(MYSQL *mysql, const char *query, unsigned long length)
  • 函数参数传递方式

    2016-08-20 09:40:12
    函数参数传递方式 C++中函数有3种参数传递方式: •按值传递(pass by value) •指针传递(pass by pointer) •引用传递(pass by reference) 一.按值传递 值传递:把实参表达式的值传递给对应的形参...
  • VBA函数传递参数方式

    万次阅读 2018-03-04 20:58:03
    VBA函数传递参数值时分为Byval(值传递)和Byref(地址传递),用法上,分别相当于C/C++的值传递使用方法和引用传递使用方法。在VBA中,参数传递的默认方式是Byref,因为本质想法是对于相同命名的参数,在系统中采用...
  • PHP回调函数类型传递方式总结

    千次阅读 2017-10-25 23:17:07
    我们这里通过array_map()函数来进行测试 方式1、全局函数 function foo($val){ return intval($val)+1;...//回调函数传递方式 $res = array_map('foo', $arr); /** 输出如下: array (size=6) 0 => int 1 1
  • PHP函数传递参数方式

    千次阅读 2016-11-20 20:55:51
    函数调用时候,如果是普通的变量参数(字符、整形、浮点、数组)是直接去的这个变量参数的值,传递函数中进行运算,不会对函数外的参数进行修改。如果参数是对象,则会把参数的地址传递函数中,函数
  • 这里我们将其称作调用函数,调用函数需要向函数传递输入(参数),那么第一种传参方式我们称为按值传递(后面还会出现指针传递和引用传递)。首先明确按值传递的机制:在main中调用函数,这里会将实参传递给我们声明...
  • 函数传递

    2017-04-23 13:14:19
    依据值传递方式在定义函数的时候,需在数组的尾部加一对方括号。而也可使用不带方括号的数组名作为参数传递,即向函数传递数组首元素的地址,这种方法是用数组名作为实参。除此以外,还有一种与数组无关的方法,便是...
  • 对于不可变对象作为函数参数,相当于C系语言的值传递; 对于可变对象作为函数参数,相当于C系语言的引用传递。 我们可以分析下楼主的代码,参数为不可变对象: def add(num): num = num + 10 d = 2 add(d) prin....
  • 而向函数传递参数的方式有四种,分别是值传递、引用传递、默认参数和可变长度参数。 1. 值传递 值传递是 PHP 中函数的默认传值方式,也称为“拷贝传值”。顾名思义值传递的方式会将实参的值复制一份再传递给函数的...
  • 函数返回值传递方式

    2008-08-01 10:11:00
    函数返回值传递方式 其实,返回值的传递从处理上也可以想象为函数调用的一个out形参数; 函数返回值传递方式也是函数调用约定的一部分; 有返回值的函数返回时:一般int、指针等32bit数据值(包括32bit结构)通过eax...
  • 主要介绍了Python3中函数参数传递方式,结合实例形式较为详细的分析了Python3中函数参数传递的常见操作技巧,需要的朋友可以参考下
  • Python函数的参数传递方式一、普通defadd(a,b):returna+bprint(add(1,2))#输出结果:3二、可选参数defmyjoin(string,sep='_'):#此处sep的缺省参数为"_"returnsep.join(string)print(myjoin(TTTT))#输出结果:T_T_T_T...
  • 函数参数的传递方式

    2017-11-27 11:38:21
    函数参数的传递方式 根据实参传递给形参值的不同,通常有值传递方式和地址传递方式两种。 值传递方式函数调用时,为形参分配单元,并将实参的值复制到形参中; 调用结束,形参单元被释放,实参单元仍保留并维持...
  • 64位函数参数传递方式

    千次阅读 2018-03-08 18:54:19
    64位函数传参方式
  • 函数参数传递方式详解

    千次阅读 2014-07-21 09:23:14
    1. 函数参数传递方式之一:值传递   (1)值传递的一个错误认识 先看如下的一个问题: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */ {  int tmp;  tmp = x;  x= y;  y...
  • 函数参数的传递方式 基本介绍 在前面函数注意事项和使用细节时,已经了解了值类型和引用类型,这里再系统总结一下,值类型参数默认就是值传递,而引用类型参数默认就是引用传递。 两种传递方式 值传递 ...
  • Java函数参数传递方式详解

    千次阅读 2018-06-21 09:29:03
    转:http://zzproc.iteye.com/blog/1328591 在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递
  • 函数传递结构的三种方式 零、写在前面 在程序设计的过程当中,我们经常会涉及到选择数据的类型,在很多情况下,单单是普通的变量和数组并不足以满足我们的需求,这时候,C语言为我们提供了一种计较好用的数据类型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,791
精华内容 6,316
关键字:

函数传递方式