代码开发中,关于程序参数传递的问题,不管程序的参数有多么复杂(指针变量,指针指针的变量),在参数传递过程中,我们都一致把它当做实参传给的是形参的名字,例如:
函数定义:int swapp(int* x, int* y);
假设在主函数main调用swapp(&a, &b),发生的操作是x=&a;y=&b,而不是a=x,b=y,这就是所谓的地址传递;在swapp里面操作的时候
int swapp(int* x, int* y) { Int temp; Temp= *x;//这里操作的其实是x指针指向的数据 *x = *y; *y = temp; }
|
这里由于每个函数都会有自己的堆栈区,所以,上面*x和*y操作的是主函数main分配的栈区,所以swapp执行完毕后,swapp函数的堆栈空间回收,但main函数的堆栈空间还在,所以达到了数据交换的效果。
如果是引用传递(这里注意C里面是不支持引用的,所以如果文件后缀名为*.c的话,那么编译会出错,引用时C++对C的重要扩展,因此只有后缀名为*.cpp才能顺利编译通过)。
函数定义:int swapp(int &x, int &y);
那么在调用的时候swapp(a, b)时发生的操作是编译器没有为参数x和y分配内存,而是用a,b在内存的位置,可以通过下面的例子来说明这个问题:
int main(void) { int a=3; int b=7; printf("%x,%x\n",&a,&b); swapp3(a,b); //printf("%d,%d\n",a,b); return 0; }
void swapp3(int &x, int &y) { int temp; printf("%x,%x",&x, &y); temp = x; x = y; y = temp; } |
以上运行的结果是:
13ff7c, 13ff78(不同人编译可能地址不一样)
13ff7c, 13ff78
结果是一样的,说明引用并没有为形参分配空间,用的还是实参的空间。