C++函数的三种传递方式为:值传递、指针传递和引用传递数据结构
值传递:函数
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; }
指针传递:spa
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.值传递:有一个形参向函数所属的栈拷贝数据的过程,若是值传递的对象是类对象或是大的结构体对象,将耗费必定的时间和空间。code
2.指针传递:一样有一个形参向函数所属的栈拷贝数据的过程,但拷贝的数据是一个固定为4字节的地址。对象
3.引用传递:一样有上述的数据拷贝过程,但其是针对地址的,至关于为该数据所在的地址起了一个别名。blog
效率上讲,指针传递和引用传递比值传递效率高。通常主张使用引用传递,代码逻辑上更加紧凑、清晰。内存
引用传递作函数参数”是C++的特性,C语言不支持。class
例如:数据结构带&与不带&效率
带&的是引用型参数,它是地址传递,其实参会随着形参的改变而改变;不带&的参数是通常参数,是值传递,其实参不会随着形参的改变而改变。因此,结构改变,而且须要传回这种改变的要用引用型参数,不然用通常参数。GetElem(L,i)只是找到第i个元素的值,线性表的结构并未发生任何改变,因此参数L前面不用加&。ListInsert(&L,i,e)是在线性表L的第i个元素处插入一个数值为e的元素,线性表L的结构发生了改变,长度增长了,因此在L前必须加上&。若是不加,显示L时,新增元素就显示不出来,显示L的长度,也仍然是增长之前的值,比实际长度少1.