是否有任何情况或特定示例需要我们为工作提供指针?即可以在不使用指针的情况下完成需要指针的事情吗?我们可以将指针作为函数参数发送,但这可以通过返回的数据来完成。我们可以使用指针来更改函数中的多个变量,但也有一种解决方法。
我们真的需要指针吗?
我知道这是一个愚蠢的问题,对不起,但在这种情况下对我来说似乎是正确的,我只是想知道是否有一些我们不能使用指针做的事情。
是否有任何情况或特定示例需要我们为工作提供指针?即可以在不使用指针的情况下完成需要指针的事情吗?我们可以将指针作为函数参数发送,但这可以通过返回的数据来完成。我们可以使用指针来更改函数中的多个变量,但也有一种解决方法。
我们真的需要指针吗?
我知道这是一个愚蠢的问题,对不起,但在这种情况下对我来说似乎是正确的,我只是想知道是否有一些我们不能使用指针做的事情。
在高级语言范式的设计中可以避免使用指针(以 java 为例),但它们往往会再次出现在该语言声称提供的功能的实际实际实现中。
除非您使用某种动态重新配置的 FPGA 架构、状态机群或与您的计算机类似的想法,否则实际的计算机器并不是非常面向对象的。我们不在存储设备中执行操作,而是获取数据,对其进行计算,然后将其写回。为了在内存中查找数据,我们使用地址的概念(有些东西称为内容可寻址内存,但对于大多数用途而言,它们并不可取)。一旦你决定你的数据(或函数体,或包含两者的结构)在内存中的某个地址,你必须弄清楚你将如何处理这个地址。您可以将地址写入另一个内存位置,我们有最熟悉的指针概念。您可以将地址存储在堆栈中,但那 s 只是相对于称为“堆栈指针”的寄存器的存储。或者您可以将地址存储在寄存器或指令字中。
但是,如果您查看指令字的实际格式,对于非平凡的处理器,“寄存器”实际上是称为寄存器文件的特殊片上存储器中的编号位置。RISC 对它们进行编号的传统使得这一点特别明显,但即使在命名寄存器的汇编语言方案中也是如此 - MOV 或任何指令将有几个位确定指令的类型和格式,以及编码寄存器的几个位每个操作数的编号。因此,寄存器间接寻址在技术上是一个存储地址的内存位置,即一个指针。相似地,
结论:您可以对高级程序员隐藏指针,但只要您的实现基于
(可寻址数据存储器/寄存器文件)<-> CPU -<->(可寻址程序存储器)
计算的想法,你无法在实现层面避免它们。
我们需要高级语言的指针吗?在严格的图灵机意义上,不。然而,实际上,我们不是用图灵机编码——我们用高级语言编码,开发人员需要某些结构来减轻编写代码的脑力工作量。指针使某些抽象(例如链表)更容易表达。因此,虽然在对“需要”这个词的最严格解释中,答案可能是否定的,但在实践中,答案是肯定的,我们确实需要它们。
请阅读 StackOverflow 常见问题解答。
我认为指针可以用作(有效的)数组迭代器非常有用。
例如(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# 提供了指针,但让我们假装它没有)。
指针的功能是引用的超集。你可以用引用做的所有事情都可以用指针做。指针是比引用更强大的工具,这就是 C 语言使用指针的原因。它是一种低级的强大语言。
是否有任何情况或具体示例需要我们为工作提供指针
是的,例如指针算术。
//copy string to a buffer
char buffer[1024];
strcpy(buffer, "hello ");
strcpy(buffer + 6, "world!");
可以在不使用指针的情况下完成需要指针的事情吗?
当然,您想将一个大对象传递给一个方法。您可以传递指向它的指针,而不是复制它,但传递引用可能会更好。
void foo(Object const& o); // <- this one is prefered
void foo(Object *o);
这是一组如何将对象传递给函数的规则。
我们可以将指针作为函数参数发送,但这可以通过返回的数据来完成吗?
可以办到。返回指针的问题是“指针指向的存储位置是什么?”。返回局部变量是一个危险的想法。(C++ 11 用移动语义解决了这个问题)
我们可以使用指针来更改函数中的多个变量,但也有一种解决方法
对不起,但我不明白这一点。
我们真的需要指针吗?
是的,我们有。
您需要在许多情况下使用指针,尤其是在考虑内存消耗和程序时间时,例如,当要将大数组传递给不修改它的子程序时,可能首选单向方法。但是,将数组传递给函数将需要将整个数组移动到子程序的本地存储区域。这在时间和空间上都是昂贵的。因为这个大数组通常是通过引用传递的。