1 引用–>效率是关键!!
1.1 引用解决的是什么问题?
C++函数中参数的传递方式是传值。在函数域中为参数重新分配内存。而把实参的数值传递到新分配的内存中。这样能有效地避免函数的副作用。
如果要求改变的实参是一个复杂的对象,重新分配内存就会引起程序执行效率大大下降。于是在C++中使用一种新的导出型数据类型——引用(reference),可以解决上面的难题,引用又称别名(alias)。
上面的话是什么意思呢?举个栗子:
void swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
void main()
{
int a = 10;
int b = 20;
swap(a,b);
}
我们想要让a=20,b=10;但上面的swap函数不能将实参转换过来,即运行完以后,a依旧=10,b=20。问题出在我们应该代入的是实参对应的地址,即指针的方式传递,如下:
void swap(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
void main()
{
int a = 10;
int b = 20;
swap(&a,&b); //&a,&b是两个实参的地址
}
这里对指针不熟悉的同学可以参考 菜鸟教程——C++指针 或者翻到最底看补充部分。
那么如果放到C++里面,我们就不用指针这么麻烦了,直接使用引用&就可以解决,解决如下:
void swap1(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
}
void main()
{
int a = 10;
int b = 20;
swap1(a,b);
}
即可达到上述交换实参的目的。
其上述的实质是,当我们一开始使用int x,int y时,相当于新开辟了两个存储空间,所以在函数内部的操作实际上只影响到了新开辟的存储空间,故而主函数中的实参没有改变;而当我们使用引用 int &x,int &y时,就不会再为x,y新开辟空间,只是相当于给实参a,b新取了两个名字x和y,大大提高了代码的效率。
1.2 引用的定义
引用不是定义一个新的变量,而是给一个已经定义的变量重新起一个别名,也就是C++系统不为引用类型变量分配内存空间。引用主要用于函数之间的数据传递。
定义的格式为:
类型 &引用变量名 = 已定义过的变量名;
跟指针一样,我们的引用可以对变量、对指针、对数组进行引用;但对常量的引用只能用常引用;对变量可以进行常引用(const 引用)。
2 补充——指针
指针 int *ip 是一个变量,其值 ip 为另一个变量的地址,即内存位置的直接地址。指针变量使用前需要声明,一般形式为:
类型 *指针变量的名称;
eg: float *fp; 表示一个浮点型的指针。
所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。
使用指针时会频繁进行以下几个操作:
- 定义一个指针变量 int *ip;
- 把变量地址赋值给指针
- 访问指针变量中可用地址的值
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl; // 20
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl; // 0xbfc601ac
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl; // 20
return 0;
}
当上面的代码被编译和执行时,它会产生下列结果:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20