request-free-img

指针是C和C++的灵魂:深入理解指针的核心原理

指针在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;

总结思考

现在你是否对指针有了更深一层的认识呢?


更多问题探讨,请关注公众号:程序员角