一.首先要更正很多人的一个误区
很多人学习编程是从C语言开始学起的,也有些学习者从C++学起。初学者很容易混淆的一个是,C中没有引用传递的概念,而引用传递的概念是C++所持有的。因本身C++是C的超集,所以这一点很多人会下意识的进入这个误区。
二.什么是引用传递,它和值传递和指针传递有何异同?
- 值传递。(代码由C语言实现)
#include <stdio.h>
//声明函数
void function(int getInt);
//主函数
int main()
{
int initInt = 100; //初始initInt的值
printf("调用function前\tinitInt的值:\t");
printf("%d\n", initInt);
//调用函数function(),尝试通过function的形参getInt,改变initInt的值
//观察initInt的值会不会因此受影响
function(initInt);
printf("调用function后\tinitInt的值:\t");
printf("%d\n", initInt);
}
//函数定义
void function(int getInt)
{
getInt = 60;
printf("------------------------------------------------\n\
这里是在function()内部\n");
printf("\t\tgetInt的值:\t");
printf("%d\n",getInt);
printf("End\n------------------------------------------------\n");
}
输出结果:
调用function前 initInt的值: 100
------------------------------------------------
这里是在function()内部
getInt的值: 60
End
------------------------------------------------
调用function后 initInt的值: 100
分析:
从结果上看,当调用某个函数时,函数内更改形参的值时,并不会对传递的实参造成影响,即不会更改实参的值。
事实上,调用函数function()时,是在内存单元的栈中创建一个新空间getInt,并保存由initInt传过来的值100。因此,getInt和initInt相互独立,互不影响。当函数调用结束时,用于保存数值的getInt的空间就会被编译器回收。
- 地址传递(代码由C++实现)
#include <iostream>
void function(int* ptrGet);
int main()
{
//初始化,并把100所在的地址交给ptrInit
int initInt = 100;
int* ptrInit &