Farseer

导航

C#函数参数传值讨论(一)

知道C#中的数据类型分为简单(Primitive)类型和引用(Refenrence)类型两种。那函数之间的传值是怎么实现的那?C#是C/C++语系的,不妨先了解一下,C/C++的函数参数是如何传值的。

先来看一下C语言中经典的指针应用的例子,两个数值交换。
#include <stdio.h>
void swap(int,int);
void main()
{
  
int a=0;
  
int b=1;
  
int c;
  swap(a,b);
  printf(
"%d,%d",a,b);
  scanf(
"%d",&c);
}

void swap(int a,int b)
{
 
int temp;
 temp
=b;
 b
=a;
 a
=temp;
 printf(
"%d,%d",a,b);
}



这样做不会实现a,b值的交换,因为在swap里,a,b是main()函数中的副本,跟main()函数里的a,b除了初始值一样外,没有其他任何联系通过查看地址可以看出,main函数中a的地址跟swap中a的地址不相同。在swap里a,b值确实发生了交换,可这跟main()函数没有任何关系。

#include <stdio.h>
void TreatParament(int **);

void swap(int *,int*);
void main()
{
   
int a=0;
   
int b=1;
   swap(
&a,&b);
   printf(
"%d,%d",a,b);
}

void swap(int *a,int *b)
{
    
int temp;
    temp
=*b;
    
*b=*a;
    
*a=temp;
}

如上所示就可以实现交换,swap的函数参数是main函数中变量a,b的地址,在swap中通过取内容符号*,就可以取到main()函数里的a,b值,从而直接对其进行操作,直接实现a,b值的交换。

上面的代码由于直接传了&a,&b,所有不容易看出问题的实质。不妨改写成如下方式
#include <stdio.h>
void TreatParament(int **);

void swap(int *,int*);
void main()
{
   
int a=0;
   
int b=1;
   
int *c=&a;
   
int *d=&b;
   swap(c,d);
   printf(
"%d,%d",a,b);
}

void swap(int *a,int *b)
{
    
int temp;
    temp
=*b;
    
*b=*a;
    
*a=temp;
}

这样通过查看,main函数中的c,d值的地址来看出值拷贝的过程.
c的地址是DS:FFEE,而a的地址是DS:FFE4.由此可以看出,a实际上是c的一个拷贝,而a变量本身的存储空间跟c是不同的,只不过值是一样的,都是main函数中变量a的地址而已。

通过以上的例子可以看出,在C语言里的函数传递严格按照传值方式进行,任何形参的值都是实参的拷贝,无论参数是值还是指针,或者指针的指针。

posted on 2005-03-14 19:29  佛西亚  阅读(1120)  评论(0)    收藏  举报