什么是指针?
举个生活中的例子,当一个人披上护士服,我们把这个人叫做护士,当这个人披上军服,我们又会把这个人叫做军人。
同样的道理,当一个变量保存的是内存中的一个值的时候,那么这个变量就叫做普通变量,而当这个变量保存的是一个内存地址的时候,那么这个变量就叫做指针。如果还是不理解,那么就来看下面的图。
在计算机里,内存是以字节为单位进行组织的,每一个字节都会对应一个内存地址。内存地址中,保存的则是具体的数据,很明显,我们想要获取某个数据,就必须找到它所在的内存地址,通过内存地址去找它。
上面我说过,指针,本质上就是一个保存着内存地址的变量。下面我们就通过代码来看,在C语言里,指针是如何通过代码体现的。
先定义一个int类型的变量,变量名是number
int number = 10;
接下来创建一个指针
int *p ;
注意这里的p就是指针的名字,其实就是一个变量名,只不过它保存的是一个内存地址,为了和普通变量以示区分,所以才叫指针。
那么接下来,我们就往p里保存内存地址。
上面我说过,一个数据既然保存在内存中,那么该数据就必然有它对应的内存地址,比如变量number 所保存的10,这个10它所在 的内存地址要怎么获取呢?
答案很简单,只需要通过&number,就表示获取10所在的内存地址。因为10是保存在变量里的,所以&number就相当于是获取10所在的内存地址。明白了这点后,那么就好办了,如下代码就表示,将&number的地址保存到指针p里。
p = &number;
下面我们就来通过完整的程序,将p里面的内存地址输出来看一下
#include "CMakeProject1.h"
using namespace std;
int main()
{
int number = 10;
int *p = &number;
printf("%x", p);
system("pause");
return 0;
}
运行结果如下
这里说明下,%x,表示将p里的值以16进制的形式展示。
注意这里的12ff92c就是number的内存地址,数据10就是保存在这个内存地址里。
我们可以通过内存分析工具,亲自去看一下这个内存地址是不是真的保存了一个10。
现在跟我做,根据下图,依次点击到内存1
在打开的窗口,按照如下输入
现在你明白指针是什么了吧,它其实就是一个保存着内存地址的变量,我们将这种变量叫做指针。
现在再来学习一个操作,就是通过指针获取number中的值,代码如下
这里需要注意的是,%d是一个占位符,它表示将*p获取到的值以整数展示。