指针在C和C++中的重要地位
在C和C++中,指针占据非常重要的地位,它是C和C++语言的核心概念之一,也是其强大灵活性和复杂性的源泉。

什么是指针?
今天这个视频我就来帮助大家理解指针。
请注意在这个视频中我们不会涉及智能指针。
理解内存:指针的基础
想要完全理解指针,首先得理解什么是内存。
我们平时所看到这种8G,16G的物理内存条,当它被插入内存槽中,启动系统后,它会被操作系统进行虚拟化抽象,使得每个程序都可以安全灵活的使用自己的内存空间。
当我们运行程序时,程序会首先被加载到内存中。内存是一块连续空间,它可以被理解为一排排的小格子,每个格子都有一个编号,这就是地址。
每个地址可以存放一个数据,比如一个数字或一个字符或者是一条代码。它们都是通过地址进行定位,比如“我要读第100号格子里的数据”。
被加载到内存的代码会告诉CPU应该做什么事情。而如果你想操作被加载到内存中的变量或者数据,则可以使用指针。
指针的本质定义
到此我们可以给出一句话总结,指针就是一个数字,它记录了变量或者数据在内存中的具体位置。
在内存中的每个变量都有一个地址。这个地址可以通过取地址符&来获取,你可以简单的理解它的作用是:请告诉我X变量的内存地址是什么。
int x = 6;
std::cout << &x; // 输出 x 的地址
定义和使用指针变量
我们现在取到了一个变量的地址,并且把这个地址保存在另一个变量中,它就是指针。
指针变量是专门用来存储地址的变量。
定义指针时需要指定它指向的变量类型,并在变量名前加上 *。
int* ptr = &x; // ptr 存储了 x 的地址
我们现在在这里设置一个断点,我们可以看PTR的值是一个16进制整数,它就是变量X的在内存中的地址。它只是显示成16进制,你也可以设置成显示十进制,这不重要。
查看内存中的实际值
我们现在来看一下这个地址的内存中的值是什么。
打开调试菜单找到内存,然后我们把这个内存地址复制到这里然后回车。
前边是内存地址,后边是内存中存储的值,这里是06 00 00 00,它采用小端模式存储,就是我们赋值给X变量的06。
解引用:通过指针访问和修改值
那要如何通过指针访问并修改内存中的值呢?
通过指针访问它指向的变量的值,这个过程叫解引用,用符号 * 实现。
int x = 6;
int* ptr = &x; // ptr 存储了 x 的地址
std::cout << *ptr; // 解引用,获取 x 的值
这里使用*号解引用,就可以访问到指针指向的变量的值。
如果需要修改它的值,那在解引用后赋值就可以了。
*ptr = 8;
我们在这里设置一个断点,可以看到这时候X变量在内存中的值是6,然后我们执行修改,可以看到现在内存中的值变成了红色,表示值被修改了,现在变成8了。
多级指针:指针的指针
你应该也发现了,其实指针本身也是一个变量,那么它也需要被保存在内存中,因此你也可以使用取地址符&来取一个指针的地址,并把它保存在另一个二级指针中。
依此类推,你甚至可以使用3级指针。
而对于2级指针,3级指针需要修改所指向变量的值,同样也是使用多级解引用就可以了。
指针的实际应用:堆内存操作
明白指针的核心原理之后,如何使用它就简单了。
例如我们有这样一行堆内存操作的代码。
char *buffer = new char[10];
我们知道char类型占用1个字节,因此这里后边指定的长度是10个CHAR表示申请10个字节的长度。
你可以简单的理解为,这行代码向系统申请10个字节长度的堆内存,并将这段内存的开始地址保存在buffer指针中。
然后你就可以向这个指针写入数据。
在不需要使用这块内存时,就可以使用delete释放它。
delete []buffer;
总结思考
现在你是否对指针有了更深一层的认识呢?


