开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
关键问题一、传递引用与传指针、传值的区别?
1. 值传递 (pass by value),指针传递(pass by pointer),当发生函数调用时,需要给形参分配存储单元、当传递是对象时,要调用拷贝构造函数。 而且指针最后析构时,要处理内存释放问题。
2.引用传递(pass by refenrence),在内存中没有产生形参。效率大大提高!也不用处理指针的析构问题。如果传递数组的话需要整个拷贝,而引用不需要。
int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
说明:
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。
ra=1; 等价于 a=1;
(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。
(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。
数组引用
引用即别名
这样比指针传地址方便多了
形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,编译器不能知道是变量还是数组
普通传值和引用传值对比:
数组普通传值:a-->a[10] (或a[])
数组引用传值:a-->(&a)[10] a-->vector&a
变量普通传值:a-->a
变量引用传值:a-->(&a)
C++数组的引用:
引用即别名
这样比传地址方便多了
形参中的(&a)[10]可以就看做a数组的别名,肯定要指定数组大小,如果没有后面的数组大小,天知道是变量还是数组
普通传值和引用传值对比:
数组普通传值:a-->a[10] (或a[])
数组引用传值:a-->(&a)[10] a-->vector<int>&a
变量普通传值:a-->a
变量引用传值:a-->(&a)
#include <iostream>
using namespace std;
void test(int a[10]){// 数组普通传值,用于打印数组a的值
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
void readData(int (&a)[10]){//数组引用传值:将a数组赋值为0--9
for(int i=0;i<10;i++)
{
a[i]=i;
}
}
void printData(int (&a)[10]){//数组引用传值:用于打印数组a的值
for(int i=0;i<10;i++)
{
printf("%d ",a[i]);
}
}
int main(){
int a[10]={0}; //为a数组中的每一个赋初值为0
test(a); // 数组普通传值,用于打印数组a的值
readData(a);//数组引用传值:将a数组赋值为0--9
printData(a);//数组引用传值:用于打印数组a的值
return 0;
}