值传递:
void fun(int x){
x += 5; //修改的只是y在栈中copy x,x只是y的一个副本,在内存中重新开辟的一块临时空间把y的值 送给了x;这样也增加了程序运行的时间,降低了程序的效率。
}
void main(void){
int y = 0;
fun(y);
cout<<\"y = \"<<y<<endl; //y = 0;
}
指针传递:
void fun(int *x){
*x += 5; //修改的是指针x指向的内存单元值
}
void main(void){
int y = 0;
fun(&y);
cout<<<<\"y = \"<<y<<endl; //y = 5;
}
引用传递:
void fun(int &x){
x += 5; //修改的是x引用的对象值 &x = y;
}
void main(void){
int y = 0;
fun(y);
cout<<<<\"y = \"<<y<<endl; //y = 5;
}
1.值传递:有一个形参向函数所属的栈拷贝数据的过程,如果值传递的对象是类对象或是大的结构体对象,将耗费一定的时间和空间。
2.指针传递:同样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节的地址。
3.引用传递:同样有上述的数据拷贝过程,但其是针对地址的,相当于为该数据所在的地址起了一个别名。
效率上讲,指针传递和引用传递比值传递效率高。一般主张使用引用传递,代码逻辑上更加紧凑、清晰。
引用传递做函数参数”是C++的特性,C语言不支持。
例如:数据结构带&与不带&
带&的是引用型参数,它是地址传递,其实参会随着形参的改变而改变;不带&的参数是一般参数,是值传递,其实参不会随着形参的改变而改变。所以,结构改变,并且需要传回这种改变的要用引用型参数,否则用一般参数。GetElem(L,i)只是找到第i个元素的值,线性表的结构并未发生任何改变,所以参数L前面不用加&。ListInsert(&L,i,e)是在线性表L的第i个元素处插入一个数值为e的元素,线性表L的结构发生了改变,长度增加了,所以在L前必须加上&。如果不加,显示L时,新增元素就显示不出来,显示L的长度,也仍然是增加以前的值,比实际长度少1.