一、概述
话不多说,先上结论:
定义语句 | 声明语句 | 类型 | 方法 |
int y=1; | int y; | 普通类型 | 略 |
int &x=y; | int &x; | 引用类型(普通类型int的引用类型) | 自右向左看,最靠近x的是&,所以x是引用类型,再向左看,是int,所以是普通类型的引用类型 |
int *p=&y; | int *p; | 指针类型(普通类型int的指针类型) | 自右向左看,最靠近x的是*,所以x是指针类型,再向左看,是int,所以是普通类型的指针类型 |
int * &x2=p; | int * &x2; | 指针引用类型(指针类型int的引用类型) | 自右向左看,最靠近x的是&,所以x是引用类型,再向左看,是*,所以是指针类型的引用类型,再向左看,是int,所以是int指针类型的引用类型 |
int & *p2=&y; | int & *p2; | 引用指针类型(普通类型int的指针类型) | 自右向左看,最靠近x的是*,所以x是指针类型,再向左看,是&,所以是引用类型的指针类型,再向左看,是int,所以是int引用类型的指针类型 (但是注意:这句是错误的,因为引用本质上只是一个别名,引用类型是无实体的,指针无法指向无实体的东西) |
王道:复杂类型中,变量标识符自右向左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。
二、三种变量
2.1 初识三种变量
代码1:
#include <iostream>
using namespace std;
int main()
{
int y=1; //定义一个普通变量y
int &x=y; //定义一个引用变量x,它是普通变量y的引用(即别名,x是y的别名)
int *p=&y; //定义一个指针变量p,指向普通变量y
cout<<"普通变量y的地址:"<<&y<<" 普通变量y的值:"<<y<<endl;
cout<<"引用变量x的地址:"<<&x<<" 引用变量x的值:"<<x<<endl;
cout<<"指针变量p的内容:"<< p<<" 指针变量p所指向变量的值:"<<*p<<endl;
return 0;
}
输出1:
普通变量y的地址:0x6afee4 普通变量y的值:1
引用变量x的地址:0x6afee4 引用变量x的值:1
指针变量p的内容:0x6afee4 指针变量p所指向变量的值:1
小结1:
(1)x是引用类型,是普通变量的引用类型。结合代码1,它引用的对象是普通变量y,C++中引用类型实际上就是一个别名,引用变量x并不是一个实际存在的独立的变量,它只是普通变量y的一个别名而已,所以引用变量x的地址和值与普通变量y的地址和值完全相同,地址均为0x6afee4,值均为1(附:只有C++中有引用变量,C语言中没有)
(2)p是指针类型,是普通类型的指针类型。结合代码1,它指向的对象是普通变量y,C/C++中指针类型变量存放的是十六进制地址,这里普通变量y的地址是0x6afee4,而指针p指向变量y,所以p指针的内容存放的就是变量y的地址,即0x6afee4,可以通过直接访问p得到,又因为p指针指向的变量就是变量y,所以p指针所指向变量的值就是变量y的值,即1,通过访问*p得到。
2.2 特殊的引用——指针类型引用
代码2:
#include <iostream>
using namespace std;
int main()
{
int y=1; //定义一个普通变量y
int &x=y; //定义一个引用变量x,它是普通变量y的引用(即别名,x是y的别名)
int *p=&y; //定义一个指针变量p,指向普通变量y
cout<<"普通变量y的地址:"<<&y<<" 普通变量y的值:"<<y<<endl;
cout<<"引用变量x的地址:"<<&x<<" 引用变量x的值:"<<x<<endl;
cout<<"指针变量p的内容:"<< p<<" 指针变量p所指向变量的值:"<<*p<<endl;
int * &x2=p; //定义一个指针类型引用,从右往左看,本质是一个引用类型变量,它引用的int指针类型,所以是指针类型引用
cout<<"指针类型引用x2的地址:"<< &x2<<" 指针类型引用x2的值:"<<x2<<endl;
return 0;
}
输出2:
普通变量y的地址:0x6afed4 普通变量y的值:1
引用变量x的地址:0x6afed4 引用变量x的值:1
指针变量p的内容:0x6afed4 指针变量p所指向变量的值:1
指针类型引用x2的地址:0x6afed0 指针类型引用x2的值:0x6afed4
小结2:x2是指针类型引用,本质上是引用类型,引用的是int指针变量。结合代码2,这里它引用的对象是p指针,p是一个指针变量,指针变量存放的是十六进制的地址,p指针的内容是0x6afed4,而x2是p指针的引用,即x2是p指针的一个别名,所以x2的值是p指针所存放内容0x6afed4,至于x2自己的地址,这里是0x6afed0
2.3 特殊的指针——引用类型指针(编译无法通过,因为指针无法指向无实体的引用)
代码3:
#include <iostream>
using namespace std;
int main()
{
int y=1; //定义一个普通变量y
int &x=y; //定义一个引用变量x,它是普通变量y的引用(即别名,x是y的别名)
int *p=&y; //定义一个指针变量p,指向普通变量y
cout<<"普通变量y的地址:"<<&y<<" 普通变量y的值:"<<y<<endl;
cout<<"引用变量x的地址:"<<&x<<" 引用变量x的值:"<<x<<endl;
cout<<"指针变量p的地址:"<< p<<" 指针变量p的值:"<<*p<<endl;
//int & *p2=&y; //定义一个引用类型指针,从右往左看,本质是一个指针类型变量,它引用的int引用类型,但是因为引用只是别名,引用是没有实体的,所以不能指向它,这句代码报错
//error: cannot declare pointer to 'int&' 不能声明指针指向int引用类型 (因为引用只是别名,不是实体)
//cout<<"引用类型指针p2的地址:"<< p2<<" 引用类型指针p2的值;"<<*p2<<endl;
return 0;
}
三、小结
定义语句 | 声明语句 | 类型 | 方法 |
int y=1; | int y; | 普通类型 | 略 |
int &x=y; | int &x; | 引用类型(普通类型int的引用类型) | 自右向左看,最靠近x的是&,所以x是引用类型,再向左看,是int,所以是普通类型的引用类型 |
int *p=&y; | int *p; | 指针类型(普通类型int的指针类型) | 自右向左看,最靠近x的是*,所以x是指针类型,再向左看,是int,所以是普通类型的指针类型 |
int * &x2=p; | int * &x2; | 指针引用类型(指针类型int的引用类型) | 自右向左看,最靠近x的是&,所以x是引用类型,再向左看,是*,所以是指针类型的引用类型,再向左看,是int,所以是int指针类型的引用类型 |
int & *p2=&y; | int & *p2; | 引用指针类型(普通类型int的指针类型) | 自右向左看,最靠近x的是*,所以x是指针类型,再向左看,是&,所以是引用类型的指针类型,再向左看,是int,所以是int引用类型的指针类型 (但是注意:这句是错误的,因为引用本质上只是一个别名,引用类型是无实体的,指针无法指向无实体的东西) |
王道:复杂类型中,变量标识符自右向左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。
天天打码,天天进步!