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