8.2 C++ 引用与取别名
C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。
普通变量引用: 引用的实质就是取别名,&写到等号左侧叫引用,写到等号右侧叫取地址.
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int x = 10;
int &tmp = x; // 普通引用
int *ptr = &x; // 定义指针
cout << "tmp => "<< &tmp << endl;
cout << "x => "<< &x << endl;
cout << "ptr => " << ptr << endl;
system("pause");
return 0;
}
普通数组引用: 普通数组应用指针类型。
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int Array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
// 第一种引用取别名的方式
int(&p_array)[10] = Array; // 给数组取别名(引用数组)
// 用别名输出引用数据
for (int x = 0; x < 10; x++)
cout << p_array[x] << " ";
// 第二种引用取别名的方式
typedef int(type_array)[10]; // 定义具有10个元素的数组
type_array &type_ptr = Array;
for (int x = 0; x < 10; x++)
cout << type_ptr[x] << " ";
system("pause");
return 0;
}
向函数中传递引用: 参数传递3种方式,传递数值,传递地址,还可以传递引用.
#include <iostream>
using namespace std;
// 传递引用实现对换
void MySwap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
cout << "MySwap ==> x = " << x << endl;
}
// 传递指针实现对换
void MySwap_PTR(int *x, int *y)
{
int tmp = *x;
*x = *y;
*y = tmp;
cout << "MySwap_PTR ==> x = " << *x << endl;
}
int main(int argc, char* argv[])
{
int x = 10;
int y = 20;
cout << "x = " << x << endl;
MySwap(x, y);
cout << "x = " << x << endl;
system("pause");
return 0;
}
返回引用的函数: 将一个函数定义为可引用的类型,可在表达式内使用左值引用。
#include <iostream>
using namespace std;
int & dowork()
{ // 局部变量x,返回前销毁,引用则不存在了
int x = 10;
cout << "x = " << x << endl;
return x;
}
int main(int argc, char* argv[])
{
int &ret = dowork();
cout << ret << endl; // 第一次输出正常
cout << ret << endl; // 第二次输出由于引用被释放,所以就会产生错误
dowork() = 1000; // 引用也可以作为左值使用
int re_ret = dowork() = 1000; // 相当于执行 re_ret = x = 1000;
cout << re_ret << endl;
system("pause");
return 0;
}
定义常量引用: 常量引用一般情况下不可修改,但是我们可以通过分配新的内存的方式强行修改它.
#include <iostream>
using namespace std;
int dowork()
{
const int &ref = 100; // 常量应用无法被修改
// 如果真的想要修改,我们可以使用以下方式
int *ptr = (int*)&ref;
*ptr = 2000;
return ref;
}
int do_work(const int &val)
{
int *ptr = (int*)&val;
*ptr = 1000;
return val;
}
int main(int argc, char* argv[])
{
int ret = dowork();
cout << ret << endl;
int ret_val = do_work(10);
cout << ret_val << endl;
system("pause");
return 0;
}
定义指针引用: 通过指针的方式引用函数。
#include <iostream>
using namespace std;
struct Person { int m_age; };
void allocat(Person **ptr)
{
*ptr = (Person *)malloc(sizeof(Person));
(*ptr)->m_age = 100;
}
void allocatByref(Person* &ptr)
{
ptr = (Person *)malloc(sizeof(Person));
ptr->m_age = 1000;
}
int main(int argc, char* argv[])
{
// 普通开辟空间写法
struct Person *ptr = NULL;
allocat(&ptr);
cout << "ptr --> " << ptr->m_age << endl;
// 使用指针引用开辟空间
Person *ptr_byref = NULL;
allocatByref(ptr_byref);
cout << "ptr_byref --> " << (*ptr_byref).m_age << endl;
system("pause");
return 0;
}
8.2 C++ 引用与取别名的更多相关文章
- 在WHERE子句中引用取别名的列
版权说明:作者:张颖希(PocketZ's Blog)出处:http://www.cnblogs.com/PocketZ本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页 ...
- 1.6 在WHERE子句中引用取别名的列
如下查询,会抛出错误:mysql> select sal as salary, comm as commission from emp where salary < 5000;ERROR ...
- 1.06 在WHERE子句中引用取别名的列
如下查询,会抛出错误: mysql> select sal as salary, comm as commission from emp where salary < 5000;ERROR ...
- [转载]C++中 引用&与取地址&的区别
一个是用来传值的 一个是用来获取首地址的 &(引用)==>出现在变量声明语句中位于变量左边时,表示声明的是引用. 例如: int &rf; // 声明一个int型的引用r ...
- C++中 引用&与取地址&的区别
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- mysql合并查询结果及为表和字段取别名
利用union关键字,可以给出多条select语句,并将它们的结果组合成单个的结果. 合并是,两个表对应的列数和数据类型必须相同. 各个select语句之间使用union或union all关键字分隔 ...
- 使用Spring实例化Bean的方法以及Bean取别名
一.通过构造方法实例化Bean bean中加构造方法 public class Bean1 { public Bean1() { System.out.println("Bean1构造方法. ...
- C++中引用与取地址
所谓引用就是为对象起一个别名.例如变量b = &a,b就是a的一个引用.对b的任何操作等同于对a的操作,也就是说,如果你改变了b的值,同时a的值也会发生改变.b就是a的另外一个名字,他们实质是 ...
- 对于多个列的转行(一个值均匀分布在两个列中),对于个别字段通过取别名,join方式解决。
例如,这个表的结构: select r.* from RPDATA2016 r WHERE r.data_bbid='HY052' 如图 对于最后两列,如果是字符类型,会存在倒数第二列,是数字类型,会 ...
- C语言中 指针、引用和取值
指针是一个存储计算机内存地址的变量.从指针指向的内存读取数据称作指针的取值.指针可以指向某些具体类型的变量地址,例如int.long和double.指针也可以是void类型.NULL指针和未初始化指针 ...
随机推荐
- ES6常用知识学习札记
转载请注明出处 原文连接 http://blog.huanghanlian.com/article/5c7aa6c7bf3acc0864870f9d es6 是什么 首先弄明白ECMA和js的关系.E ...
- 干掉 Navicat! 一款数据分析师必备的数据库可视化工具
数据开发,离不开数据库,一款优秀的数据库开发和管理工具可以达到事半功倍的效果.市面上比较流行的数据库管理工具主要有Navicat.DBeaver.SQLyog等等,Navicat是其中的无冕之王,其拳 ...
- Codeforces Round #727 (Div. 2) A~D题题解
比赛链接:Here 1539A. Contest Start 让我们找出哪些参与者会干扰参与者i.这些是数字在 \(i+1\) 和 \(i+min(t/x,n)\)之间的参与者.所以第一个最大值 \( ...
- vue学习笔记 十五、组件挂载过程及query方式带参数的页面跳转
系列导航 vue学习笔记 一.环境搭建 vue学习笔记 二.环境搭建+项目创建 vue学习笔记 三.文件和目录结构 vue学习笔记 四.定义组件(组件基本结构) vue学习笔记 五.创建子组件实例 v ...
- 【驱动】以太网扫盲(三)PHY的控制器驱动框架分析
1. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII/XGMII等多种媒体独立接口(介质无关接口)与数据链路层的MAC芯片相连,并 ...
- 强大的PDF格式转换器--迅捷PDF转换器
1.功能十分强大,具体如图所示,实现了多种文件格式的转换,PDF合并和PDF密码解除也帮了我很大的忙(注意这里的密码解除是强行解除,不需要你知道密码) 2.资源分享 https://www.aliyu ...
- [转帖]CoreDNS loop 插件异常问题
https://zhuanlan.zhihu.com/p/476611162 背景 最近有遇到一个客户集群,发现集群中的 CoreDNS 老是异常 (loop 插件检测到有回路后进行 panic) ...
- tempfs 的再学习
tempfs 的再学习 背景 最近学习研究linux的内存buffer 和 cache相关的知识. 发现对linux的VFS的理解其实非常不到位. 再验证内存的使用的page caches和 drop ...
- [转帖]《AWK程序设计语言》笔记(1)—— AWK入门与简单案例
原文为 <The AWK Programming Language>,GitHub上有中译版,不过有些内容翻译的比较奇怪,建议跟原版对照着看 https://github.com/wuzh ...
- 使用buildx在x86机器上面编译arm64架构的Docker镜像
buildx 多架构编译 安装docker 下载docker 下载buildx 安装架构支持 docker run --privileged --rm tonistiigi/binfmt --inst ...