一、引用概念及使用
1.概念:
引用可以看做一个已经定义了的变量的别名。
方法:类型名 &变量名=变量名;
在引用之前被引用对象必须初始化。
char a='a';
char &b=a;
注意:
1.&在这里只是起标识作用,并没有起求址运算
2.不能只引用而不初始化。
int &b;//是错误的
3.不能初始化为NULL
char a=NULL;
char &b=a;//引用不能赋值为空
4.被引用的对象必须初始化
int a;
int &b=a;//a没有初始化
5.引用时候类型必须匹配
int a=10;
char &b=a;//类型不匹配
引用后,引用和被引用的对象相当于指向同一片内存空间。
2.引用的使用
对引用a为b
int a=10;
int &b=a;//引用 给a取了一个别名b
cout<<"a:"<<a<<endl;//输出a的值
cout<<"b:"<<b<<endl;//操作b,相当于操作a
a:10
b:10
再一次对a进行引用为c
int a=10;
int &b=a;//引用 给a取了一个别名b
cout<<"a:"<<a<<endl;//输出a的值
cout<<"b:"<<b<<endl;//操作b,相当于操作a
a=100;
int &c=a;//引用 给a又取了一个别名c
cout<<"a:"<<a<<endl;
cout<<"b:"<<b<<endl;
cout<<"c:"<<c<<endl;
a:10
b:10
a:100
b:100
c:100
此时的b,c本质上也就是a,对a,b,c就行操作本质上也是对于一个空间上的数进行操作;
二、引用的本质
char a='a';
char &b=a;//char &b=a等价于char* const b = &a;
当然这是在c++内部的发生的。
2.C++编译器在编译过程中使用常指针作为引用的内部的实现,因此引用所占的空间大小与指针相同,只是这个过程发生在编译器的内部,用户不可见罢了。
float a='a';//
float &b=a;//这里编译器自动执行 float* const b = &a;
b = 'd';//编译器将执行 &b='d';
3.验证引用占用空间大小
首先得明白不同机器上常指针的大小是不同的,在32位上常指针大小为4个字节,在64位上大小为8字节。
在验证引用占用空间大小时,运用到sizeof,sizeof求的是数据类型的大小,而并不是求的是某个变量的大小。
float a='a';
float &b=a;
cout<<"a的大小"<<sizeof(b)<<endl;
a的大小4
值得说明的是,这里a的大小为4,这是因为在c++编译器中自动将字符a装换成其ASCII值97,这个时候a所占用的内存空间就是4.
cout<<"a的大小"<<sizeof('a')<<endl;
a的大小1
这段代码才是准确的求了字符a的大小。
那么怎么求引用的大小呢?我们可以利用结构体来求。
struct s{
char &a;
char &b;
};
int main(){
cout<<"s的大小"<<sizeof(s)<<endl;
return 0;
}
s的大小16
结构体里不能初始化,包括引用。
这样就求出了引用所占用的内存空间,两个引用的大小为16,那么一个引用的大小就为8,和常指针的大小相等。
三.引用在函数中做参数
引用在函数中做参数,普通引用在声明的时候必须初始化,而引用作为参数时不用进行初始化。
#include<iostream>
using namespace std;
void printf1(int* a){//用指针来接收地址
*a=100;//解引用
cout<<*a<<endl;
}
int main(){
int a;
printf1(&a);//这里是c语言里面的传址
cout<<a<<endl;//这里的a和printf1函数里的a不等价,函数里是指针
return 0;
}
#include<iostream>
using namespace std;
void printf1(int &a){//引用
a=100;
cout<<a<<endl;
}
int main(){
int a;
printf1(a);//
cout<<a<<endl;// 在printf1里面修改后,a的值也被修改
return 0;
}
printf1函数里的a100
主函数里的100
2.引用的意义
1)引用作为其他变量的别名存在,因此在一些场合可以代替指针
2)引用对于指针来说具有更好的可读性和实用性
void swap2(int *a,int *b){//C语言中用指针实现两个数的交换
int t;
t=*a;
*a=*b;
*b=t;
}
void swap1(int &a,int &b){//C++引用实现两个数的交换
int t;
t=a;
a=b;
b=t;
}
在这里可以看出来,引用的方式没有指针的方法那么麻烦,更加简单明了。