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指针和未初始化指针 ...
随机推荐
- 使用root ssh登录ubuntu22.4配置
前言 在安装k8s集群时,需要使用root用户ssh登录远程服务器进行安装操作,但是root登录是默认关闭的,因此本篇讲解如何开启配置, 当前测试版本 ubuntu22.4 安装部署 使用管理权限打开 ...
- BAPI_PO_CHANGE 采购订单修改服务
修改服务页签里面的价格和数量,达到修改净价和条件里面金额的目的 数据可以通过采购订单查询ESLH和ESLL表获取 "------------------------------------- ...
- javascript yield
代码: function delay(time) { return new Promise(function (resolve, reject) { setTimeout(() => { res ...
- WPF Window无边框窗体阴影效果
WPF通过WindowChrome实现Window无边框窗体阴影效果 代码: <Window x:Class="SunCreate.PACP.Client.UI.GIS.CameraD ...
- 【CJsonObject】C++ JSON 解析器使用教程
能选封装的尽量不使用底层的 一.CJsonObject 简介 CJsonObject 是 Bwar 基于 cJSON 全新开发一个 C++ 版的 JSON 库. CJsonObject 的最大优势是轻 ...
- 素数算法补充之"筛法"
国庆中秋双节,就不写太长的文章了. 补充和复习一下以前没写的素数区间筛法算法吧 部分证明过程来自OI wiki 素数筛法 如果我们想要知道小于等于 \(n\) 有多少个素数呢? 一个自然的想法是我们对 ...
- 服务降级,限流等--sentinel(SpringCloud Alibaba)
一. 介绍Sentinel,中文翻译为哨兵,是为微服务提供流量控制.熔断降级的功能,它和Hystrix提供的功能一样,可以有效的解决微服务调用产生的"雪崩"效应,为微服务系统提供了 ...
- [转帖]OceanBase实验4:迁移MySQL数据到OceanBase集群
服务器环境 1)12核48G,操作系统为centos 7.9系统,单节点三副本1-1-1集群. 2)源MySQL数据库:与OceanBase同一台服务器,版本为MySQL 5.7. 1.使用 mysq ...
- [转帖]Oracle迁移到MySQL时数据类型转换问题
https://www.cnblogs.com/yeyuzhuanjia/p/17431979.html 最近在做"去O"(去除Oracle数据库)的相关工作,需要将Oracle表 ...
- [转帖]使用 TiUP 升级 TiDB
本文档适用于以下升级路径: 使用 TiUP 从 TiDB 4.0 版本升级至 TiDB 7.1. 使用 TiUP 从 TiDB 5.0-5.4 版本升级至 TiDB 7.1. 使用 TiUP 从 Ti ...