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指针和未初始化指针 ...
随机推荐
- TCP 拥塞控制对数据延迟的影响
哈喽大家好,我是咸鱼 今天分享一篇文章,是关于 TCP 拥塞控制对数据延迟产生的影响的.作者在服务延迟变高之后进行抓包分析,结果发现时间花在了 TCP 本身的机制上面:客户端并不是将请求一股脑发送给服 ...
- 《consul 简易上手指南》
consul 是一个用来做服务发现的框架,具有分布式.高可用以及可横向扩展的特性 什么是服务发现?为什么要实现服务发现? 举个常见的例子: 假设有一台 client 想要实现不同的业务,就需要调用接口 ...
- AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)
AB水题, C - Tsundoku 题目描述 有两摞书,一摞有 $n$ 本,从上至下每本需阅读 $a_i$ 分钟,一摞有 $m$ 本,从上至下每本需阅读 $b_i$ 分钟,问最多能在 $k$ 分钟内 ...
- jdk1.8(java8)新特性
借鉴之:https://blog.csdn.net/qq_28410283/article/details/80601495 Lambda 表达式: //1.Lambda 表达式,也可称为闭包,它是推 ...
- 在mounted 中发生异步和同步共存的问题
https://www.cnblogs.com/ifon/p/12391923.html
- IDEA用上这十大插件绝对舒服
本文翻译自国外论坛 medium,原文地址:https://medium.com/@xjpp22/top-10-plugins-for-intellij-idea-you-dont-want-to-m ...
- 驾校考试系统 考试模块的 UI效果图
初始系统界面 判断题 单选题 多选题
- yakit的web fuzzer功能的使用
问题 yakit没有Burp 的 Intruder 爆破模块,那么yakit该怎么进行参数爆破?yakit参数爆破的方式与burp有什么区别? 前言 手工测试场景中需要渗透人员对报文进行反复的发送畸形 ...
- 深入理解Kafka核心设计及原理(一):初识Kafka
转载请注明出处: 1.1 kafka简介 Kafka 起初是由 Linkedin 公司采用 Scala 语言开发的一个多分区.多副本且基于 ZooKeeper协调的分布式消息系统,现己被捐献给 Apa ...
- springBoot 整合 hikari
Hikari是一款非常强大,高效,并且号称"史上最快连接池".并且在springboot2.0之后,采用的默认数据库连接池就是Hikari.不需要引入依赖,已经在SpringBoo ...