[本文转载于B站UP,仅限于个人学习,详细可以阅读原视频学习。]
1、首先,我们只管感受一下什么是内存空间
这里我们声明一个整型变量a并把它初始化为1,编译器会为它预留一个4字节的空间,我们将这块空间取名为a并赋值为1,它的地址对应内存空间在物理上的位置。
同理,我们继续创建一个变量b并初始化为2,开辟一块空间,名为b,赋值为2,对应一个地址。
int a = 1;
int b = 2;
内存空间如下图所示:
2、接下来我们来通过一个赋值操作直观理解左值和右值的概念
int a = 1;
int b = 2;
a = b;
这里的a是一个左值,用于标识特定数据对象的名称或者表达式,这里的b是一个右值,是能赋值给可修.改左值的量,用于储存值的数据区域统称为数据对象。
左值指定一个对象,可以引用内存中的地址;右值可以用表达式的值这一概念来描述。等号不是区分左右值的标准,但是赋值运算符左侧运算对象,应该是可修改的左值。
3、然后我们说说地址
地址实际上没有包含在内存空间内,它更像绑定在内存上的一个固有属性,对应内存空间在计算机里的物理物理位置,但地址又不同于变量名。
举个例子。我们说501教室是第一音乐教室,501教室是教室的位置,第一音乐教室是教室的名字,某天四级考试,即使501教室 改成了第二考场,它的位置也是不变的。地址对应一个物理位置,而变量名是我们为了方便使用这个位置而给它(这个位置)取的名字。
4、最后我们进入正题,聊聊什么是指针
指针是C语言的一个内置数据类型,和int,char等其他数据类型一样,指针的值是一个地址,正如int类型的值是一个整型,它规定地址的取值范围和存储指针需要的空间大小,还规定了指针这一数据类型能进行的一系列操作。
5、再来说指针变量
首先,我们创建一个整型指针变量p并把它初始化为a的地址。
int a = 1;
int* p = &a;
同理,p将获得一个内存空间,名字为p。接着我们用&符号来取a的地址。先找到a的内存空间,再找到它的地址,把地址赋值到p。
现在我们就知道了,什么是指针变量。指针变量就是一个值为内存地址,数据类型是指针的变量。正如a是一个值为整数,数据类型是整型的变量一样。
既然指针变量存放的永远是一个地址,那么指针变量的类型又是什么呢?
这里我们是p是一个int*类型,实际上是说p里面存放的指针,指向的那个内存空间,里面的值是int类型。
6、最后我们再来讲一下间接运算符(*)
既然指针变量p里面存放的是地址,那么将p作为右值时,表达式的值一定是个地址,但我们使用指针更多是为了获取指针地址上对应的值,这就需要用的间接运算符(*)。
现在我们来获取指针所指向的值,并把它赋值给d。
int a = 1;
int* p = &a;
int d = *p;
首先我们要定位到指针变量p,然后获取p里面存放的值。
接着通过地址,找到对应的内存空间,然后去内存空间存放的值。
再把这个值,赋值给d。