变量的引用

原文链接:https://blog.csdn.net/ChaoFeiLi/article/details/103593740

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

注意点:

  1. 变量的引用在声明时必须初始化
  2. 变量的引用作为变量的别名,因此他们指向同一个内存空间,所以变量的引用不占用存储空间
  3. 引用在初始化后不能被重新定义为声明为另一个变量的别名,也就是说引用一旦被定义,不可更改引

#include<iostream>
using namespace std;
int main(){
int a = 10;
int&b = a;//给a起别名,叫b
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;
}

 

posted @ 2023-03-13 09:59  编程小白bai  阅读(111)  评论(0)    收藏  举报