我说C/C++——普通变量、引用变量、指针变量

一、概述

    话不多说,先上结论:

定义语句 声明语句 类型 方法
 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引用类型的指针类型

(但是注意:这句是错误的,因为引用本质上只是一个别名,引用类型是无实体的,指针无法指向无实体的东西)

王道:复杂类型中,变量标识符自右向左看,最靠近标识符的是变量的本质类型,而再往左即为对变量类型的进一步修饰。

天天打码,天天进步!

发布了177 篇原创文章 · 获赞 31 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/qq_36963950/article/details/103317014