C++引用

一、引用概念及使用

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就行操作本质上也是对于一个空间上的数进行操作;

二、引用的本质

1.引用的本质在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;
} 

 在这里可以看出来,引用的方式没有指针的方法那么麻烦,更加简单明了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值