首页 > 编程语言 >每天学点C++之引用

每天学点C++之引用

时间:2024-09-26 21:50:15浏览次数:3  
标签:std 每天 int C++ 引用 using include 指针

一 概述

请大家先看一段代码:

#include<iostream>
using namespace std;
int main() {
	int a = 3;
	int& b = a;
	cout << &b << endl;
	cout << &a << endl;
	b = 4;
	cout << a << endl;
	cout << b << endl;

	return 0;
}

运行结果如下:

我们发现,b的地址与a相同,更改b的值a的值也发生了改变,这就是引用。大家可以这么理解,比如说你有一个朋友姓张,我们叫他老张,这个老张虽然不是他的本名但我们都默认老张就是他,这个老张就相当于这里的引用,引用与本尊只是名字不同其它都相同,甚至连内存地址都一模一样。相信通过以上的介绍大家对引用有了一个大致的了解,那么接下来 我们要全面地认识它。

二引用的语法

1 数据类型& 变量名 = 变量名。

2必须要初始化,且初始化后不可更改

#include<iostream>
using namespace std;
int main() {
	int a = 3;
	int& b
	return 0;
}

再看一段代码:

#include<iostream>
using namespace std;
int main() {
	int a = 3, c = 4;
	int& b = a;
	b = c;//按值传递,将c的值赋给b
	cout << b << endl;
	return 0;
}

这段代码运行结果为4 。

 三 引用的本质

不知道大家有没有发现上述语法特性与我之前一篇文章将的一个东西很相似,没错就是指针常量(大家可以区看我的了一篇文章:写文章-CSDN创作中心

大家可以通过调试去查看二者的反汇编代码去一探究竟。

四 引用的用途

既然引用的本质是指针常量,那我们就用指针就好了呀为什么要再引入一个新的概念呢,是因为引用更加简洁。

1 用于函数传参:

#include<iostream>
using namespace std;
void swap(int& a, int& b) {
	int tmp = a;
	a = b;
    b = tmp;
}
int main() {
	int a = 3;
	int b = 4;
	swap(a, b);
	cout << a << endl;
	cout << b << endl;
	return 0;
}

 就比如最简单的交换两数值的函数,我们至少可以少些很多*,岂不美哉。

2 用于函数返回值

再看一段代码:

#include<iostream>
using namespace std;
int& getEle(int arr[], int index) {
	return arr[index];
}
int main() {
	int a[5] = { 1, 2, 3, 4, 5 };
	cout << getEle(a, 0) << endl;
	getEle(a, 0) = 999;
	cout << getEle(a, 0);

}

函数返回但是该下标数组元素的引用。

我们居然可以给一个函数赋值,是不是很神奇 。

五 常量引用

引用 = 指针常量

常量引用(把引用用上述等式替换) = 常量指针常量,大家可以去看我的另一篇文章(写文章-CSDN创作中心

六 指针引用

大家看一段代码:

#include<iostream>
using namespace std;
void alloc(int* ptr, int index) {
	ptr = new int[index];
}
void test() {
	int* ptr = NULL;
	alloc(ptr, 5);
	cout << ptr << endl;
}
int main() {
	test();
}

运行结果如下:

为什么把一段地址空间赋给ptr,却仍是无效的地址呢?请大家注意:

#include<iostream>
using namespace std;
void alloc(int* ptr1, int index) {
	cout << &ptr1 << endl;
	ptr1 = new int[index];
}
void test() {
	int* ptr = NULL;
	cout << &ptr << endl;
	alloc(ptr, 5);
}
int main() {
	test();
}

运行结果如下:

形参与实参的地址是不一样的,我们改变形参并不能相应地改变实参 ,大家要记住,我们传参都是按值传递,这里我们穿的是指针的值,即指针存储的地址,我画个图大家就明白了:

我们把new的空间赋给形参,是让形参指向了一段地址而实参不会有任何改变。

那我们该怎么做呢?这就需要用到二级指针,但是为了方便我们可以用引用指针:

 

#include<iostream>
using namespace std;
void alloc(int* &ptr1, int index) {//注意*在前,因为int *是一个数据类型:整型指针类型
	cout << &ptr1 << endl;
	ptr1 = new int[index];
}
void test() {
	int* ptr = NULL;
	cout << &ptr << endl;
	alloc(ptr, 5);
}
int main() {
	test();
}

相当于ptr1是整型指针变量ptr的别名,操作ptr1就是操作ptr。

今天的内容就到这里,希望大家多多支持!

标签:std,每天,int,C++,引用,using,include,指针
From: https://blog.csdn.net/2301_79024503/article/details/142577355

相关文章

  • C++实现一个配置系统
    开发环境Qt6& boost目标通过模板的匹配方式,实现key-value的配置读取方式,value支持基本类型及自定义类型。实现通过重载类型转换类Transformer实现多种类型的和QString的转换#include<QString>#include<QJsonDocument>#include<QJsonObject>#include<QJsonArray>......
  • 【C++习题】2.双指针_移动零
    文章目录题目链接:题目描述:解法(快排的思想:数组划分区间-数组分两块):C++算法代码:图解题目链接:283.移动零题目描述:解法(快排的思想:数组划分区间-数组分两块):双指针算法,利用数组下标充当指针。我们可以用一个cur指针来扫描整个数组,另一个dest指针用来记......
  • Java中面向对象将引用数据类型作为参数类型
    当参数类型为类名,抽象类名,接口名的时候1.当一个类名作为参数类型在一个方法的时候classStudent{publicvoidfun1(){System.out.println("我是父亲");}}classStudentDemo1{publicvoidfun2(Studentstudent){//当调用到这个方法时相当于:Student......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【哈希表】2024E-选修
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出说明解题思路代码pythonjavacpp时空复......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......
  • C++ day07
    C++笔试题合集:1、什么是虚函数?什么是纯虚函数?    1>在类中定义函数时,在函数名前加上virtual关键字,该函数就是虚函数,虚函数可以保证在父子类中只有一个该函数。    2>当虚函数头=0;时该函数就是纯虚函数,当类中的某些成员函数没有实现的意义,仅仅时该类中拥有......
  • 【C++】你对vector的了解又有多少呢?
    【C++】你对vector的了解又有多少呢?一.vector的介绍二.vector的使用1.vector的构造代码举例:2.vector空间增长问题resize机制:reserve扩容机制:3.vector增删查改代码举例一:代码举例二:一.vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vect......
  • C++ 原始字符串(raw string literal )R“(...)“
    C++11可以在代码里嵌入一段原始字符串,该原始字符串不作任何转义,所见即所得。这个特性对于编写代码时要输入多行字符串,或者含带有特殊字符的字符串提供了巨大方便。语法:     R"(...)"记忆点:1.不做任何转义 stringstr="aaa\nbbb\nccc\n"; cout<<str<<endl......
  • c++笔记
    类和对象类用于指定对象的形式,是一种用户自定义的数据类型,它是一种封装了数据和函数的组合。类中的数据称为成员变量,函数称为成员函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。一、定义类类的定义需要使用关键字class,然后指定类的名称,类的......
  • C++—单例设计模式
    单例设计模式C++中的单例设计模式是一种常用的软件设计模式,其核心目的是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。以下是对C++单例设计模式的详细解释:一、单例设计模式的定义单例模式(SingletonPattern)是一种创建型设计模式,它确保一个类只有一个实例,......