当前位置: 首页 > news >正文

c++引用和指针

引用和指针

什么是引用:

引用是一种取名机制,它可以给变量重新取一新的名字,所以引用也叫别名。

为什么使用引用:

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++中尽量多使用引用,少使用指针。


http://www.mrgr.cn/news/18991.html

相关文章:

  • 通过vscode连接linux服务器时terminal显示空白无法运行
  • VMware Workstation 17.6 Pro 发布下载,新增功能概览
  • SMB攻击利用之-设置远程mimikatz程序为定时任务流量数据包分析
  • 【鸿蒙开发从0到1 day05】
  • 今天来聊一聊前端框架有哪些呢? 主流Vue和React
  • 【C++ Primer Plus习题】10.1
  • chapter12-异常(Exception)——(注解)——day14
  • accelerate一些类和函数说明二
  • 记录一下安装腾讯混元文生图模型的艰辛历程
  • 新版某数字壳脱壳,过frida检测,及重打包
  • 全网都在学,2024最新大模型畅销的三本书!千言万语,尽在书中
  • KAN 学习 Day2 —— utils.py及spline.py 代码解读及测试
  • ES6 URL对象
  • java和js计算文件的SHA-256哈希值
  • 鼎曼高品质老白茶,在时光的声色里芬芳隽永
  • RDP最小化之后仍然保持UI渲染的方法
  • 【计算机网络】socket编程 --- 实现简易TCP网络程序
  • C++进阶面试题
  • 九月最新蜘蛛池|泛码网的SEO工具怎么样?
  • 【C++】---STL之用哈希桶模拟实现:unordered_set和unordered_map