引用和指针
什么是引用:
引用是一种取名机制,它可以给变量重新取一新的名字,所以引用也叫别名。
为什么使用引用:
1、跨函数共享变量,把函数的参数设置引用,可以在函数内共享实参变量,并且是否共享实参变量由函数的实现者决定,这种设计给了函数实现者权限,并且给了函数调用者方便。
#include <iostream> using namespace std; void func(int& dashixiong) { dashixiong = 5678; cout << &dashixiong << " " << dashixiong << endl; } int main(int argc,const char* argv[]) { int sunlingling = 1234; int& dashixiong = sunlingling; func(sunlingling); cout << &sunlingling << " " << sunlingling << endl; return 0; }
2、提高函数的传参效率,默认情况下,函数传参单向值传递,变量有多少个字节就要拷贝多个字节的数据,而传递变量的地址,可以需要拷贝4字节的数据,而使用引用一个都不需要拷贝,它比指针的传参的效率还要高。
#include <iostream> using namespace std; struct Data { char str[20]; int num; char ch; }; void func(Data& d) { } int main(int argc,const char* argv[]) { Data d; for(int i=0; i<200000000; i++) { func(d); d.num++; } return 0; }
使用引用要注意的问题:
引用在定义时必须初始化,所以不可能存在空引用,但可能存在悬空引用,但使用指针可能空指针、野指针,所以使用引用比使用指针安全。
#include <iostream> using namespace std; int& func(void) { int num = 1234; return num; } int main(int argc,const char* argv[]) { /* int& hehe = func(); cout << hehe << endl; */ int* p = new int(1234); cout << *p << endl; int& num = *p; delete p; cout << num << endl; return 0; }
可以引用常量数据、字面值数据,但需要定义const类型的引用。
int main(int argc,const char* argv[]) { const int num = 1234; const int& hehe = num; const int& xixi = 56789; cout << hehe << endl; cout << num << endl; cout << xixi << endl; return 0; }
函数的参数使用引用时,实参变量就有被修改的风险,为了防止实参变量被破坏,可以使用const修改引用。
void func(const int& num) { num = 23456789; } int main(int argc,const char* argv[]) { int num = 1234; func(num); cout << num << endl; return 0; }
可以引用一个数组(定义数组的引用),但不能定义引用型的数组。
int main(int argc,const char* argv[]) { int arr[5] = {1,2,3,4,5}; // 可以定义数组指针 int (*arr1)[5] = &arr; // 可以定义指针数组 int* arr2[5]; // 可以定义数组引用或引用数组 int (&arr3)[5] = arr; // 不可以定义引用型的数组 int& arr4[5]; return 0; }
总结:在C++中尽量多使用引用,少使用指针。