问题

为什么要有指针?

回答
为什么要弄出指针这个东西来?这玩意儿,初学的时候确实挺让人头疼的,绕来绕去的,感觉就像在玩一个复杂的游戏。但如果你把这层迷雾拨开,你会发现,它简直就是 C 语言的一把瑞士军刀,几乎无所不能,是实现很多高效、灵活操作的基石。

想象一下,你在一个大房子里,里面有很多房间,每个房间里都放着不同的东西。你想找一个特定的东西,比如一把钥匙。

最直接的方法是什么?

你可能想到的是,直接把钥匙放在你的手里。但问题是,你的手一次只能拿一把钥匙。如果你有很多钥匙,你得一一把它们传递给别人,这效率很低,而且容易弄混。

那么,有没有更聪明的方法?

这就是指针的作用。与其直接把钥匙(数据)给你,我不如给你一个纸条,上面写着钥匙在哪里。这个纸条,就是指针。

为什么这个纸条这么重要?

1. 指向“真正的东西”: 这个纸条不是钥匙本身,而是告诉你钥匙放在哪个抽屉里,哪个房间里。在计算机的世界里,数据都存储在内存的某个位置。指针就像这个纸条,它存储的不是数据本身,而是数据在内存中的“地址”。通过这个地址,我们就能找到并操作那个“真正的东西”。

2. 可以改变“目标”: 假设一开始纸条指向的是一把生锈的铁钥匙。但后来我把一把闪亮的铜钥匙放到了那个抽屉里。你手里的纸条(指针)地址没变,但你通过它找到的“钥匙”却变了。这意味着,通过指针,我们可以修改它指向的那个内存位置上的数据。这非常强大,比如你写一个函数,想让它修改某个变量的值,直接把变量地址传给它(用指针),函数里就能修改原变量,而不是只修改一个副本。

3. 传递“引用”,而非“副本”: 想象一下,你要给一群人看一个非常大的雕塑。你是把雕塑的复制品交给每个人,还是给每个人一张写着雕塑在哪里(地址)的纸条?显然是后者更省事,也避免了复制品的麻烦。函数传参时,如果数据很大,直接传递数据会复制一份,耗费时间和内存。如果传递指针,只是传递了一个地址,非常轻巧。函数内部通过这个地址去操作原数据,效率高得不是一点点。

4. 动态分配内存: 计算机在程序运行时,经常需要临时分配一些内存空间来存放数据,比如一个临时的缓冲区,或者一个需要用户输入大小的数组。我们不知道这些空间具体在哪里,只能在需要的时候向操作系统申请,操作系统会给我们一个地址,然后把这个地址告诉我们。这个地址,就是指针。我们通过这个指针来管理这块临时分配的内存。没有指针,你根本不知道如何去使用这块申请来的内存。

5. 构建复杂数据结构: 链表、树、图这些复杂的数据结构,怎么连接起来?链表里的每个节点,除了包含自己的数据,还需要知道下一个节点在哪里,才能一环扣一环地连接起来。这个“下一个节点在哪里”的信息,就是存储在当前节点中的一个指针。通过指针,我们可以把一个个独立的数据块连接成一个有序的整体。

6. 访问底层硬件: 在一些更底层的编程场景,比如编写驱动程序,你需要直接操作某些硬件寄存器的内存地址。指针就是你唯一可以用来“触碰”这些硬件地址的工具。

举个更具体的例子:

假设你有一本非常厚的字典。

直接传递字典: 如果你要跟朋友分享这本字典,你把整本字典都给他,这是“按值传递”,很重,效率低。
传递目录页: 你给他一本目录,告诉他“第三章,第五节”就找到了你要找的那个词。这本目录页就是指针。它本身不包含那个词的意思,但告诉你如何找到那个词。而且,如果字典的内容更新了(比如增补了一些新词),你不需要重新给朋友一本新字典,他还是用那本目录去查,就能找到更新后的词。

所以,指针并不是凭空出现的,它是为了解决数据访问、传递、管理以及构建灵活数据结构的根本性需求而诞生的。它让程序能够更直接、更高效地与内存打交道,赋予了 C 语言强大的表达能力和性能。虽然一开始有些抽象,但一旦理解了它“指向地址”的核心概念,很多事情就会豁然开朗。

网友意见

user avatar

你的学习方式是错误的。

你的这些为什么要有XX的理解,大多数都是不那么正确的。


为什么要有指针,指针的内涵也就是地址是先于指针而存在的,对于C语言而言指针并不是在混沌没有指针的世界中突然发明出来的,是先有地址,然后C语言发明了一系列的语法让我们可以对地址进行操作,所以你这种学习方式是有问题的,至少不能用这种臆测的方式来学习C语言。

如果你的问题是为什么有了引用还需要有指针,我建议你先从C语言学起,再学C++语言,你就会知道引用的出现比指针晚太多了,所以根本不存在什么已经有了引用还需要指针干什么?


如果你的问题换成,如果我设计一种新的语言,是否需要设计指针,如果不设计指针,我能用什么语法来代替,这样的话,我觉得会是一个好问题。


当然,问题中最大的槽点是:

我连最基本的需求都有点不明白。我会用指针,但很多时候不明白为什么这个地方要用指针。
指针说白了就是存放的地址,可以用指针指向任何的地方,变量、结构体、类,说是“指”,其实存放这些数据的地址,方便查找,看不懂别人写的指针程序,拿出大杀招,直接画个内存分配图也能搞的明明白白。但是为什么要“指”?
我直接使用引用也能够操作这些变量、结构体、类的数据。所以关键还是为什么要另外开辟一块内存存放这些数据的地址用来访问,为什么要“指“?

按照这种说法的话,其实变量也是不需要的,变量的本质不也就是一个内存地址的别名么,你可以自己一开始把内存都规划好然后直接直接读写指定的位置就好了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有