C语言中:
在函数的执行过程中形参的改变通常不会影响相应的实参(由于传值调用,及函数的封闭性)。
如:
#include <stdio.h>
void swap(int x, int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int m = 10, n = 20;
printf("%d,%d\n", m, n);
swap(m, n);
printf("%d,%d\n", m, n);
}
程序的输出为:
10,20
10,20
swap函数并没有改变实参的值。
利用指针变量,可以改变实参的值。
#include <stdio.h>
void swap(int *x, int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
void main()
{
int m = 10, n = 20;
printf("%d,%d\n", m, n);
swap(&m, &n);
printf("%d,%d\n", m, n);
}
程序的输出为:
10,20
20,10
C++中:
C++兼容C语言,因此上面的示例在C++中有同样的输出。为了快速地改变实参的值,C++中引入了引用变量的概念。引用变量并不像其它变量那样有自己的存储单元,引用变量只是其它变量的别名。引用变量多用于函数的形参,当函数的形参为引用变量时,在函数体中改变形参也就改变了实参的值。注意其与指针变量在使用上的区别。
#include <stdio.h>
void swap(int &x, int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int m = 10, n = 20;
printf("%d,%d\n", m, n);
swap(m, n);
printf("%d,%d\n", m, n);
}
10,20
20,10
C#中:
C#中没有了指针变量,但它引入了引用类型的概念。引用类型的实质为是指针类型,它的用法同C++中的引用变量。
如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleTest
{
class Test
{
public int i = 5;
}
class Program
{
static void swap(Test x)
{
x.i = 6;
}
static void swap(int y)
{
y = 6;
}
static void Main(string[] args)
{
//引用类型
Test b = new Test();
Console.WriteLine("{0}", b.i);
swap(b);
Console.WriteLine("{0}", b.i);
//值类型
int m = 5;
Console.WriteLine("{0}", m);
swap(m);
Console.WriteLine("{0}", m);
}
}
}
程序的输出:
5
6
5
5
可见作为引用类型的类变量做形参时,如果在函数中改变则实参也会改变,而作为值类型的普通整型变量没有受到影响。
需要注意的是C#中对String类的变量区别对待,这也是为什么会有StringBuilder类。