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 += ;
else
t += ;
} static void Myfuntion1(ref int i, ref int t) // 这个函数将会以传址的方式进行运算. 因为前面加了ref关键字, 函数只要加了ref关键字就会是以传址的方式进行运算
{
if (i > t)
i += ;
else
t += ;
} static void Myfuntion2(int[] array) //这里注意, 这个函数没有带ref关键字, 但是也是以传址的方式进行运算. 因为在C#中,引用类型都是以传址的方式进行运算,而array属于数组, 数组又属于引用类型,所以....
{
for (int i = ; i < array.Length; i++)
{
array[i] = ;
}
} static void Myfuntion3 (int i , int t , out int s) //这个函数虽然返回值为Void(代表没有返回值) , 其实有返回值 因为我们加了一个新的关键字, out , 这个关键字能够将 s 单独返回. 同样out关键字也是以传址的方式进行运算的. 还有,out 参数可以不用赋值,即使你赋值了也会被忽略
{
s = ;
if (i > t)
i += ;
else
t += ;
} static void Main(string[] args)
{
// 现在我们来使用上面定义的四个函数,看看效果是怎样的.
int a = , b = , 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[]; //定义一个数组并且为它赋值
for (int i = ; i < My.Length; i++)
{
My[i] = ;
}
// 现在调用函数
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 = ;
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 * */
C# 函数的传值与传址(转)的更多相关文章
- C#-函数的传值与传址
传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bool型,char字符型,结构体等等. 传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传 ...
- Java传值和传址
调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下 ...
- js 的复制和引用 (传值和传址)
复制(传值-实参): 基本类型赋值.函数参数 引用(传址-形参): 对象.数组.函数
- javascript的变量,传值和传址,参数之间关系
先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型) ...
- Python的传值和传址与copy和deepcopy
1.传值和传址 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针).他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变,用传值传入的参数是不会 ...
- 图解JS的传值与传址
//编程过程中经常会碰到传值,传址的问题!今天的主题就是关于传值.与传址. //先讲讲赋值操作 //下例是原始类型赋值操作 var a=1,b=a,a=2; console.log("a=& ...
- javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象
对象字面量 JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay&quo ...
- 工控随笔_18_西门子_WinCC的VBS脚本_07_变量作用域和传值、传址
在vbs脚本中也存在和其他编程语言一样的概念,那就是变量的作用域,变量的作用域决 定在什么范围内可以访问. 同样的在vbs脚本中对于变量也有一个生命周期, 变量的生命周期决定了变量的存续时间 这个主要 ...
- java方法中,传参是传值还是传址问题(对比C语言、C#和C++)
问题引出: 编写一个简单的交换值的小程序,如果我们只是简单地定义一个交换函数接收两个数,在函数内部定义一个中间变量完成交换.那么当我们把a,b两个实参传给这个函数时,往往得不到预期的结果.这是为什么呢 ...
随机推荐
- centos6基础优化
一.关闭SELinux功能 selinux功能太严苛,还是关闭了吧 法一:修改配置文件,永久生效 [root@web01 ~]# sed -i 's/SELINUX=enforcing/SELINUX ...
- SQL-Redis使用详细教程
一.Redis基础部分: 1.redis介绍与安装比mysql快10倍以上 *****************redis适用场合**************** 1.取最新N个数据的操作 2.排行榜应 ...
- Vue如何引入jquery实现平滑滚动到指定位置效果
在以往的做法里首选jquery的animate实现,但是Vue里并没有这个方法.如何在Vue项目中实现点击导航平滑滚动到指定位置,为了这效果我是快要崩溃了,上网查阅了很久发现并没有真正意义上解决这个问 ...
- POJ1013称硬币【枚举】
Counterfeit Dollar Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 52474 Accepted: 16 ...
- C语言不容易识别的坑
1.重复两次定义 #include<stdio.h> #include<stdlib.h> #include<string.h> int a,b; void fun ...
- 解决在使用Amoeba遇到的问题
最近有同行在使用Amoeba 的过程中多少遇到了一些问题. 总结一下遇到问题的解决方法: 1.读写分离的时候设置的在queryRouter中设置无效? 读写分离配置的优先级别: 1)满足 ...
- 【BZOJ4710】分特产(容斥原理,组合计数)
题意:有m种特产,第i种有a[i]个 有n个同学分特产,要求: 1.恰好分完 2.每个人至少要分到一个 求方案数模10^9+7 n,m,a[i]<=1000 思路:WYZ作业 首先考虑对于每一种 ...
- poj_3006_Dirichlet's Theorem on Arithmetic Progressions_201407041030
Dirichlet's Theorem on Arithmetic Progressions Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- Apache 使用localhost(127.0.0.1)可以访问,使用本机IP(局域网)不能访问
本机ip是:192.168.1.25,输入后提示: Forbidden You don't have permission to access / on this server 对于此问题的解决办法, ...
- P1230 智力大冲浪 洛谷
https://www.luogu.org/problem/show?pid=1230 题目描述 小伟报名参加中央电视台的智力大冲浪节目.本次挑战赛吸引了众多参赛者,主持人为了表彰大家的勇气,先奖励每 ...