变量的引用

 变量的引用

定义:变量的引用是变量的别名

注意点:

  1. 变量的引用在声明时必须初始化
  2. 变量的引用作为变量的别名,因此他们指向同一个内存空间,所以变量的引用不占用存储空间
  3. 引用在初始化后不能被重新定义为声明为另一个变量的别名,也就是说引用一旦被定义,不可更改引用
#include<iostream>
using namespace std;
int main(){
	int a = 10;
	int&b = a;
	cout<<b<<endl;
	cout<<"&b:"<<&b<<"    "<<"&a:"<<&a<<endl;
	int c = 5;
	b = c;//这个地方是对引用对象的赋值
	cout<<"    "<<endl;
	cout<<"&b:"<<&b<<"    "<<"&c:"<<&c<<endl;
	cout<<b<<endl;
	//int &b = c;//引用一旦被初始化,不能重新更改, 重定义;多次初始化

	system("pause");
	return 0;
}

上述代码中b=c是对引用对象的赋值,就是改变的a的值,上面给出了结果;

引用的进一步说明

1.将引用作为函数参数

引用函数参数的初始化发生在函数调用时虚实结合实现的,同时实参传递给形参的是实参的地址

2.不能建立void类型的引用

void &a  = 9;此时void类型不占用存储空间,但是“9”占用存储空间,不符合

3.不能建立引用类型的指针变量

int & *p = &a;

 无法从“int *”转换为“int **”

参考链接:https://blog.csdn.net/SZU_Crayon/article/details/79208691

 
/*指针变量的引用*/
	int *a;       //声明指针变量,a是一个指向int地址 
	int* &p=a;    //正确,指针变量也是变量,p作为a的别名,改变p指向的值等同于对a进行相同处理 
	int b=8;
	p=&b;         //此时 p &b a 表示同一地址 
/*引用的指针*/
	int a;
	int& ra=a;   //正确
	int& *p=&ra; //error依据定义,引用必须是T类型的对象或变量,而此处试图引用地址,即引用的指针。 

4.不能建立引用的数组

int &array[12],由于[]的优先级大于&,所以array[12]表示一个数组,&array[12]表示一个引用的数组。

意思是:数组array里面的数据应该全是引用;

首先,引用必须被初始化,而数组并不能被另一个数组初始化或被另一个数组赋值,其次其中的每一个引用,无给实现一下子初始化。

然后,引用它不支持传统意义的复制,它不占用新的空间

再次,他没有意义,它可以用指针数组实现,完全可以代替

再再再次,不好实现,因为编译器不知道应该分多大的内存给引用的数组。

小结一下:可以建立数组的引用,指针的引用,但是反过来不可以(引用的数组和引用的指针,这是错误的)

5.可以建立指针变量的引用

    int a = 10;
    int *p = &a;
    int* &pt = p;//这个地方必须是指针,如果写&a也是错了,&a不是一个指针变量

6.用const修饰引用,则不允许改变引用变量的值

7.用常量或表达式对引用进行初始化,必须用const声明

    int a = 10;
    const int &p = 5+a;
    const int &pt = 5;

系统的处理过程:先生成一个临时变量用来存储表达式或常量的值,然后引用是该临时值变量的别名

8.在引用和变量类型不同时,需要添加const

    float f = 3.158;
    const int &p = f;

解释:

    float f = 3.158;
    cout<<"&f:"<<&f<<endl;
    const int &p = f;
    cout<<"转换之后的"<<endl;
    cout<<f<<endl;
    cout<<p<<endl;
    cout<<"&p:"<<&p<<endl;
    cout<<"&f:"<<&f<<endl;

系统处理过程:int temp = f,将float转为int, 然后p是temp的引用,下图中p和f的地址不一样。

在讨论如何看待是什么类型的引用的时候,先确定引用, 在确定类型。

比如:int* &p ,先看引用&p,把引用去掉,类型是int*,所以这是指针变量的引用

int (&p) [12],先看引用&p,把引用去掉,类型是int[12],所以这是数组的引用

#include<iostream>
using namespace std;
int main(){
	int a[5] = {1,2,3,4,5};
	int (&p)[5] = a;
	cout<<"p:"<<p<<"     "<<"a:"<<a<<endl;
	cout<<"p[0]:"<<p[0]<<endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值