C++中引用和指针联合使用

引用(reference)的优缺点(以int &b = a;为例)

  • 1.引用的底层是指针:(b本质上是指向a的指针),但是程序员可以把引用b当作对象a的别名,也就是可以当作一个普通的变量使用。
  • 2.引用有更加安全和高效的特性:b只能指向a,也就是说,b不能再引用其他的对象了,这一点和指针常量(指针常量指向的内存地址不可改变)类似。
  • 3.引用也消除了拷贝对象带来的开销:以下面的代码为例,就可以看出引用传递的好处了。
  • 4.引用一定是指向合法的对象,而使用指针之前要检查指针的值是否为NULL,指针指向的内存也有可能是非法的。
//引用传递,b是a的引用,一般占用8B大小的内存
void reference_func(ElementType &b);
//值传递,b是a的拷贝,占用和a一样的内存大小(4kB),这样就会大大的增加了程序的内存开销
void value_func(ElementType b);
int main(){
  //假设一个ElementType的变量占用4kB
  ElementType a = 10;
  reference_func(a);
  value_func(a);
  return 0;
}
  • 5.引用的缺点:引用定义的时候必须初始化,此外,引用缺乏灵活性,因为引用b一旦和对象a绑定了,那么b只能指向a。(注:一个对象可以有多个引用,但是一个引用变量只能引用一个个对象)

引用和指针联合使用:参数的传递如果是传递引用的话只使用 const refercence,把引用的作用限制在避免参数拷贝的开销上。然后把改变变量内容的任务交给指针

  • 1.常引用:如const int &b = a; b是a的常引用,也就是不能通过b修改a。
  • 2.将a的地址通过常引用b交给一个指针p,通过指针p访问a
  • 3.好处:常引用降低内存开销,指针访问增加了灵活性。以以下代码为例
#include <iostream>

using namespace std;
void swap(const int &a, const int &b);  //交换两个变量的值

int main() {
  int a = 13, b = 29;
  cout << "Before swap, a=" << a << ", b=" << b << endl;  // 交换前a,b
  swap(a, b);
  cout << "After  swap, a=" << a << ", b=" << b << endl;  // 交换后a,b
  return 0;  
}

void swap(const int &a, const int &b) {
  //&a是const reference,是用强制类型转换,转换为普通指针,然后赋值给p
  int* p = (int*)&a;  // 必须使用强制类型转换; p指向main函数中的对象a
  int* q = (int*)&b;  // 必须使用强制类型转换; q指向main函数中的对象b
  int temp = *p;
  *p = *q;
  *q = temp;
}
posted @ 2023-08-30 16:04  Guanjie255  阅读(109)  评论(0编辑  收藏  举报