取地址符&做函数形参?
C语言强大且危险
引入
这个问题花去了整整一天的研究。
先看一段严蔚敏的《数据结构》中栈的例程:
这里面的&S第一遍看的时候想当然的认为是取了SqStack结构体的S的地址,没有细想。然后又看到了这句。
// platform: VC++6.0
Status Pop(SqStack &S, SElemType &e); //取地址符?
我开始突然发现,这真的是取地址符吗,对照了我自己写的程序,仔细推敲发现不太对。
仔细看这里的&e,如果这是个整型的栈,那么SElemType就是int,那么这里就等于:
Status Pop(SqStack &S, int &e); //很奇怪
类比的疑问
我们都知道:
int *a,*b; /* 定义了两个整型的指针 */
int **a, **b; /* 定义了整型指针的指针 */
那么难道说是
int &e; // 定义了以一个整型数为地址的变量e?
仔细看下接下来的函数定义:
显然这里可以看出由于top指针指向的是SElemType类型,所以e是SElemType类型的。所以以上类比显然是不对的。
C/C++中的引用参数
查找了很多的资料发现,这个实际上是C++里的形参符号,必须要在跟在数据类型的后面使用。在函数内部对形参的操作都等同于直接操作原变量。
先说形参和实参
学过C语言的都知道,一个经典的例子是关于写一个交换两个变量a,b的值的函数:
// “形参不等于实参”的经典错误示范
void swap(int a,