在文献[1]中,描述二叉树时利用了函数名作为形参。在此加以说明与解释。
1.函数参数的传递方式
我们都知道,函数参数的传递一般有:值传递、指针传递和引用传递。先来回顾一下:
- 值传递时,先临时分配一块内存,将形参的值拷贝进去,在函数中利用临时分配的变量进行运算。当函数退出时,释放临时分配的内存,也就是说,不会影响原来的实参值。如下述程序及运行结果所示。
void fun1(int a) //值传递方式
{
a = a + 1; //临时分配一块内存,用于存放形参值
cout << "值传递函数中: a= " <<a << endl
<< "值传递函数中:a的地址为:"<<&a<<endl;
}
void main(void)
{
int a = 1;
fun1(a);
cout << "主函数中: a= " << a << endl
<< "主函数中:a的地址为:" << &a << endl;
}
运行结果:
2. 指针传递(地址传递)
指针传递,即地址传递时,形参为一个地址,在函数中对这个地址进行操作。比如传递一个数组名(数组的首地址),在可以访问这个数组中的元素。
void fun2(int *b)
{
b = b + 1; //取当前地址的下一个地址
cout << "值传递函数中: b= " << b[0]<<" "<<b[1] << endl
<< "值传递函数中:b的地址为:" << b << endl;
}
void main(void)
{
int b[] = { 2,3,4 };
fun2(b);
cout << "主函数中: b= " << b[0]<<" "<<b[1] << endl
<< "主函数中:b的地址为:" << &b << endl;
}
运行结果如下:
3.引用传递
引用传递时,在函数中的操作相当于是对实参的操作,会影响实参的值。
void fun3(int &c)
{
c = c + 1;
cout << "值传递函数中: c= " <<c<<endl
<< "值传递函数中:c的地址为:" << &c << endl;
void main(void)
{
int c = 3;
fun3(c);
cout << "主函数中: c= " << c<<endl
<< "主函数中:c的地址为:" << &c << endl;
}
运行结果:
2. 函数名作为形参
函数名作为形参时,类似于数组名作为形参,传递的是函数的地址。相当于上述方式中的指针传递。
作为一个函数,就必须要有形参列表。在传递过程中,要给予它正确的形参列表。
见下面的例子:
//函数名作为形参
void print_func(int i)
{
cout << i << " " << endl;
}
//函数func调用函数名为pfunc的函数,并将接收的形参i作为pfunc的形参
void main_func(void(*pfunc)(int), int i)
{
pfunc(i);
}
void main(void)
{
void(*fun)(int i); //声明函数指针,有一个int型的形参
fun = print_func;
main_func(fun, 100);
}
运行结果:
参考文献:
[1] 数据结构算法与应用:C++描述(Data Structures, Algorithms and Applications in C++ 的中文版)