全部博文(298)
分类: C/C++
2011-04-27 12:49:00
从swap函数分析函数参数
1. 函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递
(1)值传递:
void func1(int x)
{
x = x + 10;
}
(2)指针传递:
void func2 (int *x)
{
*x = *x + 10;
}
(3)引用传递:
void func2(int &x )
{
x = x + 10;
}
2. swap函数
一般实现方法:
void swap(void *pa, void *pb)
{
void c;
c = *pa;
*pa = *pb;
*pb = c;
}
示例程序1:
(1) #include
(2)
(3) void swap(int *a, int *b)
(4) {
(5) int c;
(6) c = *a;
(7) *a = *b;
(8) *b = c;
(9) }
(10) void swap1(int a, int b)
(11) {
(12) int c;
(13) c = a;
(14) a = b;
(15) b = c;
(16) }
(17) void swap2(int &a, int &b)
(18) {
(19) int c;
(20) c = a;
(21) a = b;
(22) b = c;
(23) }
(24)
(25) int main(void)
(26) {
(27) int a = 3;
(28) int b = 4;
(29) printf("before swap:a = %d, b = %d\n",a,b);
(30) swap1(a, b);
(31) printf("after swap:a = %d, b = %d\n",a,b);
(32)
(33) printf("before swap:a = %d, b = %d\n",a,b);
(34) swap2(a, b);
(35) printf("after swap:a = %d, b = %d\n",a,b);
(36)
(37)
(38) printf("before swap:a = %d, b = %d\n",a,b);
(39) swap(&a, &b);
(40) printf("after swap:a = %d, b = %d\n",a,b);
(41) return 0;
(42) }
程序结果:
before swap:a = 3, b = 4
after swap:a = 3, b = 4
before swap:a = 3, b = 4
after swap:a = 4, b = 3
before swap:a = 4, b = 3
after swap:a = 3, b = 4
请按任意键继续. . .
(1) 首先我们讨论swap1()函数,传入函数的参数是局部变量a,b,进去函数后我们使用的a,b参数的副本,因为编译器总是要为函数的每个函数的每个参数制作临时副本,变量a的副本是_a,编译器使_a = a,如果函数体里面程序修改了_a的值,不会使a的值发生改变,如下代码:
void swap1(int a, int b)
{
int c;
c = a;
a = b;
b = c;
}
使副本_a,_b交换了值,但是a,b变量的值没有发生变化。
(2) 我们开始讨论swap()函数,传入函数的参数是变量a,b的地址pa,pb,然后编译器为其函数的参数准备副本_pa,_pb,并且使_pa = pa, _pb = pb,如果函数内的程序改变了_pa的值,那么pa的值不会改变,如果函数内的程序改变了地址_pa的内容,那么相应的地址pa的内容也会改变,因为他们都在指向同一个位置。
(3) 如果是C++程序我们还可以使用引用,实现代码如下:
void swap2(int &a, int &b)
{
int c;
c = a;
a = b;
b = c;
}
swap2()函数传入的是a,b的别名,相应的改变函数内的a,b值,其参数也会发生变化。