变量名:实质上是一段连续存储空间的别名,类似于门牌号;程序中通过变量来申请并命名内存空间,通过变量的名字来使用存储空间。
引用概念
- 引用是C++新增的概念
- 引用可以看作是一个已定义的变量的别名
- 引用语法:引用类型 &引用名 = 目标变量名;
- 引用是某一变量的别名,对引用操作与直接对变量操作等同
#include <stdio.h>
#include <Windows.h>
int main(){
int a = 10;
int &b = a; // 定义了一个引用,并使用变量a初始化它
//int &c; // 定义引用必须初始化,否则会报错
printf_s("a=%d, b=%d\n", a, b); // 结果:a=10, b=10
system("pause");
return 0;
}
引用是C++的概念
使用.c文件能否通过?
#include <stdio.h>
#include <Windows.h>
int main(){
int a = 10;
int &b = a; // 编译报错
system("pause");
return 0;
}
引用做函数参数
普通引用在声明时必须用其他变量做初始化,引用做函数参数声明时无需初始化。
#include <stdio.h>
#include <Windows.h>
void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
int main(){
int a = 10;
int b = 100;
printf_s("调用swap函数前,a = %d, b = %d\n", a, b);
swap(a, b);
printf_s("调用swap函数后,a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
引用的意义
- 引用作为其他变量的别名存在,因此在一些场合可以代替指针
- 引用相对于指针来说有更好的可读性和实用性
// swap和swap1效果等同,swap可读性和实用性更高
void swap(int &a, int &b) {
int tmp = a;
a = b;
b = tmp;
}
void swap1(int *a, int *b){
int tmp = *a;
*a = *b;
*b = tmp;
}
引用的本质
-
引用在C++的内部实现是一个常指针
引用类型 &引用名 <=>类型 const *指针变量名 -
C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。
-
从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
引用结论
-
当实参传值给形参引用的时候,只不过是C++编译器帮我们手动取了一个实参地址,传给了形参引用(常量指针)
-
当我们使用引用语法时,无需考虑C++编译器引用是怎么做的;只有当我们分析奇怪的语法现象时,我们才去考虑C++编译器时怎么做的。
指针引用
#include <stdio.h>
#include <Windows.h>
void test1(int **A) {
static int age = 10;
*A = &age;
}
void test2(int *&A) {
static int age = 15;
A = &age;
}
int main(){
int *age = nullptr;
//test1(&age);
test2(age);
printf_s("age:%d\n", *age);
system("pause");
return 0;
}
以上代码分析:test1 和 test2效果相同,但是test2可读性和实用性更高。
常引用(const引用)
定义方法:const 引用类型 &引用类型名 = 另一变量;
用变量初始化常引用
这种是让变量引用变成只读,不能通过引用对变量的值进行修改
#include <stdio.h>
#include <Windows.h>
int main(){
int a = 10;
const int &b = a;
system("pause");
return 0;
}
用常量初始化常引用
在C++中,编译器会对这样定义的引用分配内存,这算是个特例!
#include <stdio.h>
#include <Windows.h>
int main(){
const int a = 10;
const int &b = a;
system("pause");
return 0;
}
const引用结论
- const &int a 相当于 const int *const a
- 普通引用相当于 int *const a
- 当时有常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段内存的别名
- 使用常量对const引用初始化后,将生成一个只读变量
奇牛学院_佳人学院链接