C# 函数的传值与传址(转)

http://www.cnblogs.com/mdnx/archive/2012/09/04/2671060.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        /*   先来了解一下什么是实参, 什么是形参.
              所谓形参其实也就是说函数定义的时候所带的参数.  比如 static void Myfuntion(int i , int t)  其中 int i  and int t 都是形参.
         *   而实参呢? 实参代表的是将要传入函数里面进行运算的两个参数, 可以是变量,也可以是常量.只要与形参类型相同即可*/

        // 函数分为传值与传址两种方式. 传值不影响实参的数据,传址则会影响实参的数据. 下面用几段代码来示例
          //在使用传值或者传址的选择上应当遵循这样一个规则.
            //1. 传值是将形参的内容复制一份给实参.
            //2. 传址是将形参与实参同时指向一个地址.
            //如果在数据较大的情况下使用传值的方式必然会影响程序性能, 所以当数据较大时可以使用传址的方式.使用传址的方式会让程序的效率大大提升.
        static void Myfuntion(int i , int t)  //这个函数将以传值的方式运行
        {
            if (i > t)
                i += 5;
            else
                t += 5;
        }

        static void Myfuntion1(ref int i, ref int t) // 这个函数将会以传址的方式进行运算. 因为前面加了ref关键字, 函数只要加了ref关键字就会是以传址的方式进行运算
        {
            if (i > t)
                i += 5;
            else
                t += 5;
        }

        static void Myfuntion2(int[] array)  //这里注意, 这个函数没有带ref关键字, 但是也是以传址的方式进行运算. 因为在C#中,引用类型都是以传址的方式进行运算,而array属于数组, 数组又属于引用类型,所以....
        {
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = 40;
            }
        }

        static void Myfuntion3 (int i , int t , out int s)  //这个函数虽然返回值为Void(代表没有返回值) , 其实有返回值 因为我们加了一个新的关键字, out , 这个关键字能够将 s 单独返回. 同样out关键字也是以传址的方式进行运算的.  还有,out 参数可以不用赋值,即使你赋值了也会被忽略
        {
            s = 50;
            if (i > t)
                i += 5;
            else
                t += 5;
        }

        static void Main(string[] args)
        {
            // 现在我们来使用上面定义的四个函数,看看效果是怎样的.
            int a = 10, b = 15, c;
            //1. 传值方式的函数
            Myfuntion(a, b);  // 这个时候a and b 还是等于 10 和 15  , 因为函数中的形参虽然改变结果了. 但是不会影响到实参.
            Console.WriteLine("a : {0} and b : {1}",a,b + "\n");

            // 2. 传址方式的函数
            Myfuntion1(ref a, ref b); //这里要注意, 函数中使用了ref关键字,在调用的时候也要使用ref关键字.  此时的结果应该是a = 10 b = 20 因为上面的代码是传址方式的, 形参发生了改变也会影响到实参
            Console.WriteLine("a : {0} and b : {1}",a,b + "\n"); 

            // 3.隐式的传址方式函数.
            int[] My = new int[5];  //定义一个数组并且为它赋值
            for (int i = 0; i < My.Length; i++)
            {
                My[i] = 30;
            }
            // 现在调用函数
            Myfuntion2(My);   //结果可想而知, my的每一位都会等于 50
            foreach (int w in My)
            {
                Console.WriteLine(w);
                Console.WriteLine();
            }

            // 4. out 参数函数
            Myfuntion3(a, b, out c); //同样, 和ref一样在调用的时候也需要加上关键字
            Console.WriteLine(c); // c应该会等于 50
            //我们试试把C赋值了之后再调用函数,看看会发生什么.
            c = 90;
            Myfuntion3(a, b, out c);
            Console.WriteLine(c);  //还是会等于50;
        }
    }
}
// 下面是运算结果 

/*  a : 10 and b : 15
-------------------
a : 10 and b : 20
------------------
40

40

40

40

40
----------------------
50
----------------------
50 

 * */
时间: 2024-10-05 23:47:49

C# 函数的传值与传址(转)的相关文章

php自定义函数的“传值”与“传址”学习笔记

参数的传递,可以分为 传值 和 传址 两种,究竟有什么区别呢? 1 2 3 4 5 6 7 8 9 10 function fun($num1,$num2) { $num1=100; $num2=1000; } $n1=1; $n2=10; fun($n1,$n2); echo “n1={$n1} n2={$n2}”; ?> 得到的结果是:n1=1 n2=10 这一段代码是传值的过程,自定义函数fun的参数传递具体$n1,$n2的值,这个很容易理解,我之前说的自定义函数都是传值,那什么是传址呢?

Java传值和传址

调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下面这个例子可以实验一下: package test; import java.util.ArrayList; import java.util.List; public class ValueAndAddress { public static void f1(int x){ x = x + 5;

javascript的变量,传值和传址,参数之间关系

先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值. 书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样.基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制

php传值与传址的区别

PHP中传值和传址的区别, 十分的简单, 看字面的意思大概就知道是什么意思了, 下面通过简单的实例看一下两者的区别. 1 $a = 5; 2 function show(&$b) { 3 $b += 10; 4 echo "函数内部:" . $b . "<hr>";//结果: 15 5 } 6 show($a); 7 echo "函数外部:" . $a . "<hr>";//结果: 15 总结:

JS 基础知识2 传值和传址

要知道传址跟传址,首先我们先了解下数据值的操作. 1复制:可以把它赋值给一个新的变量 2传递:可以将他传递给一个函数或者方法 3比较:可以与另外一个值比较,判断是否相等 简要介绍下传值: 当一个数据是通过值被操作的,那么关系到的是数据的值,在赋值的过程中,是对实际值进行了COPY,储存在一个变量或者属性或数组中,copy的值与原数据是相互独立的. 当数据通过值传递给一个函数时,数据的一份传递给这个函数,如果函数体修改了这个值,只在函数体受影响,函数外的原数据不受影响. 当一个数据通过值和另外一个

javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay":value 对象字面2??定义方法和json很像,只有一点不同,json的key 必须加"" : 对象,数组也可以作为键值 JSON的组成 Javascript Object Notation 对象字面量的一种表现形式 : 键名必须有双引号""包围 : 为什么用J

js 的复制和引用 (传值和传址)

复制(传值-实参):  基本类型赋值.函数参数 引用(传址-形参):  对象.数组.函数

传值与传址

基本类型传值 引用类型传址

Asp:函数是用传值还是传址

传址会把变量的内存地址传递到sub里,在sub里对变量所做的修改就是对原来的变量进行修改,而传值只是把变量的值传递到sub里,此时在sub里修改变量的值不会影响原来的变量. 在vb中调用函数默认是传址(byref),你可以在函数的参数前加byval使用传值方式. Private Sub test(a, ByRef b, ByVal c) a和b都是传址,c是传值 注:在asp中的函数里,默认是传址,如果需要传值,将变量前面加 ByVal 即可.