注:方便自己复习视频地址
一、引用的基本概念
引用本质上是指针
指针类型 引用类型
int* int&
double* double&
Obeject* Object&
指针定义 引用定义
int a = 123; int a = 123;
int* p = &a; int& r = a;
称作:“p指向了变量a” “r是目标对象a的引用”或“r引用了变量a”
指针的使用 引用类型
int a = 123; int a = 123;
int* p = &a; int& r = a;//引用的定义
*p = 999; r = 999;//对r的操作,就是对a的操作
引用可以看作是目标对象的一个别名,对引用的操作其实都是对目标对象的操作。
#include<stdio.h>
#include<string.h>
struct Object
{
int id;
char name[16];
};
int main()
{
Object a = {1,"shaofa"};
Object& r = a;
int size = sizeof(r);
r.rid = 999;
strcpy(r.name,"xyz");//strcpy,即string copy(字符串复制)的缩写。
return 0;
}
结果:r的值就是a的值
size的值为20,其中int为4,char数组为16。
引用必须在定义的时候初始化,也就是一创建就要与目标对象绑定。
int a = 123;
int& r; //语法错误!必须初始化必须int& r = a
相比之下,指针的用法则比较宽松
int a = 123;
int* p; //指针可以不初始化
p = &a;
二、引用的更多用法
1.引用作为函数的参数
和指针类型,引用也可以作为函数的参数,功能相同。
void test (int& a) //int& a = number
{
a = 999;
}
int main()
{
int number = 0;
test(number);
return 0;
}
结果:number的值变为999
"传引用"和"传地址"本质相同,相当于对参变量作为了一个初始化,int& a = n;
参数的传递有两种方式:
(1)传值(效率低)
(2)传地址或传引用(效率高)
2.引用作为函数的返回值
和指针一样,也可以作为函数的返回值。(难点)
#include<stdio.h>
#include<string.h>
int number = 0;//全局变量
int& test ()//初学写法
{
int& a = number;
return a;//返回引用
}
/*
int& test ()//简单写法
{
return number;//函数的返回值类型是引用类型,所以返回number的引用,而不是number的值
}
*/
int main()
{
int& r = test();//用引用类型接收
r = 123; //修改目标对象的值
return 0;
}
结果:number = 123
返回值可作为左值
如:test() = 123;
//但是不推荐,代码可读性低
#include<stdio.h>
#include<string.h>
struct Object
{
int id;
char name[16];
};
Object one;//全局变量
Object& test ()
{
return one;//返回全局变量的引用
}
int main()
{
test().id = 10;//函数的返回值是引用,可以作为左值使用
return 0;
}