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语言里的函数传递严格按照传值方式进行,任何形参的值都是实参的拷贝,无论参数是值还是指针,或者指针的指针。
先来看一下C语言中经典的指针应用的例子,两个数值交换。
这样做不会实现a,b值的交换,因为在swap里,a,b是main()函数中的副本,跟main()函数里的a,b除了初始值一样外,没有其他任何联系通过查看地址可以看出,main函数中a的地址跟swap中a的地址不相同。在swap里a,b值确实发生了交换,可这跟main()函数没有任何关系。
如上所示就可以实现交换,swap的函数参数是main函数中变量a,b的地址,在swap中通过取内容符号*,就可以取到main()函数里的a,b值,从而直接对其进行操作,直接实现a,b值的交换。
上面的代码由于直接传了&a,&b,所有不容易看出问题的实质。不妨改写成如下方式
这样通过查看,main函数中的c,d值的地址来看出值拷贝的过程.
c的地址是DS:FFEE,而a的地址是DS:FFE4.由此可以看出,a实际上是c的一个拷贝,而a变量本身的存储空间跟c是不同的,只不过值是一样的,都是main函数中变量a的地址而已。
通过以上的例子可以看出,在C语言里的函数传递严格按照传值方式进行,任何形参的值都是实参的拷贝,无论参数是值还是指针,或者指针的指针。
浙公网安备 33010602011771号