是否有任何情况或具体的例子,我们需要为作业的指针?也就是说,需要指针的事情可以不使用它们来完成吗?我们可以将指针作为函数参数发送,但这可以通过返回的数据来完成。我们可以使用指针来改变一个函数中的多个变量,但也有一个解决方法。
我们真的需要指针吗?
我知道这是一个愚蠢的问题,对不起,但在这种情况下,我只是想知道是否有什么我们不能使用指针做的事情。
发布于 2012-05-08 00:16:49
指针在设计高级语言的范型时是可以避免的--比如java --但在语言声称提供的功能的实际实现中,指针往往会再次出现。
除非您使用某种动态重新配置的FPGA架构、状态机群体或与您的计算机类似的想法,否则实际的计算机器并不是非常面向对象的。我们不在存储设备中执行操作,而是获取数据,对其进行计算,然后将其写回。为了在内存中查找数据,我们使用地址的概念(有一些东西被称为内容可寻址存储器,但在大多数情况下,它们并不可取)。一旦您确定您的数据(或函数体,或包含两者的结构)位于内存中的某个地址,您就必须弄清楚如何处理该地址。您可以将地址写入另一个内存位置,我们有一个最熟悉的指针概念。您可以将地址存储在堆栈上,但这只是相对于称为“堆栈指针”的寄存器的存储。或者,您可以将地址存储在寄存器或指令字中。
但是,如果你看一看指令字的实际格式,对于非平凡的处理器来说,“寄存器”实际上是特殊的片上存储器中的编号位置,称为寄存器文件。RISC对它们进行编号的传统使得这一点特别明显,但即使在寄存器被命名的汇编语言方案中也是如此- MOV或任何指令都将有几个位来确定指令的类型和格式,以及几个位来编码每个操作数的寄存器编号。因此,从技术上讲,寄存器间接寻址是一个内存位置保存另一个内存位置的地址,即指针。类似地,直接编码在指令字中的数据项的地址也是一个存储器位置(包含该指令字的程序存储器)引用另一个实际保存数据的存储器位置的示例。
结论:您可以对高级程序员隐藏指针,但只要您的实现基于
(可寻址数据存储器/寄存器文件) <-> CPU -<-> (可寻址程序存储器)
计算的思想,你不能在实现层面上避免它们。
发布于 2012-05-08 00:12:53
我们需要高级语言中的指针吗?在严格的图灵机意义上,不是。然而,在现实中,我们不是在图灵机中编写代码--我们使用高级语言编写代码,开发人员需要某些构造来减轻编写代码的精神工作量。指针使得某些抽象(例如链表)更容易表达。因此,尽管在对“需要”一词的最严格解释中,答案可能是否定的,但在实践中,答案是肯定的,我们确实需要它们。
请阅读StackOverflow常见问题解答。
发布于 2012-05-08 00:17:00
我认为指针可以用作数组上的(有效)迭代器,这一点非常有用。
例如(C99):
ptrdiff_t stride = 8;
double* data = ...;
size_t size = ...;
const double* end = data + size * stride;
for (double* restrict p = data; p < end; p += stride)
*p = ...;您可以看到,指针算法对于表达意图非常有用。能够传递指针+跨度来表示子数组也很有用。
一些语言不允许使用指针来操作数据(但允许引用),尽管在这些语言中,我对它们允许编写作用于数组的函数的方式一直不太满意。在C中,你可以写成。
void foo(const double* data, ptrdiff_t stride, size_t size, double* out);在C#中,你可以这样写
void Foo(double[] data, int stride, double[] output);但是现在output被强制成为一个完整的数组,而不是其他东西的子数组,或者在一个元素输出的情况下是一个普通的堆栈变量(如果您真的想要的话,C#可以提供指针,但让我们假装它不是)。
https://stackoverflow.com/questions/10485181
复制相似问题