一 概述
请大家先看一段代码:
#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