2012-05-07 168 views
3

是否有任何情况或具体的例子,我们需要指针的工作? 即可以不使用它们而需要指针的东西? 我们可以将指针作为函数参数发送,但可以通过返回的数据完成。我们可以使用指针来更改函数中的多个变量,但也有一个解决方法。我们需要指针吗?

我们确实需要指针吗?

我知道这是一个愚蠢的问题,对不起,但在这种情况下似乎对我来说是正确的 我只是想知道是否有什么我们不能使用指针做。

+0

不,我们不。如果我们这样做了,今天使用的任何编程语言如何工作? (当然,除了**一个**语言)。 –

+0

这不是一个合适的问题,使用http://programmers.stackexchange.com/ – rooftop

+9

我认为这是一个完全有效的问题。 – Puppy

回答

4

指针可避免在高级语言的范式设计 - 举个例子爪哇 - 但他们往往在语言宣称提供的功能实际实际实现再次出现。

除非你正在使用某种形式的动态地重新配置FPGA架构,状态机或类似的想法,你的电脑的殖民地,实际运算机器是不是很面向对象。我们不在存储设备中执行操作,而是取数据,对其进行计算并将其写回。为了在内存中查找数据,我们使用地址的概念(有些东西称为内容寻址内存,但对于大多数用途而言,它们不是优选的)。一旦你决定你的数据(或函数体,或包含两者的结构体)在某个地址的内存中,你必须弄清楚你将如何处理这个地址。您可以将地址写入另一个存储器位置,我们拥有最熟悉的指针概念。您可以将地址存储在堆栈中,但这只是与名为“堆栈指针”的寄存器相关的存储空间。或者您可以将地址存储在寄存器或指令字中。在特殊的片上存储器

但是,如果你看一个指令字的实际形式,为不平凡的处理器“注册”实际上是编号的位置称为寄存器文件。 RISC对它们编号的传统使得这个特别明显,但即使在命名寄存器的汇编语言方案中也是如此 - MOV或任何其他指令都会有几位决定指令的类型和格式,以及一些编码寄存器的位每个操作数的编号。因此,寄存器间接寻址在技术上是保存另一个地址的一个存储单元,也就是指针。类似地,直接编码在指令字中的数据项的地址也是一个存储器位置(包含指令字的程序存储器)的实例,涉及实际保存数据的另一位置。

结论:你可以隐藏高水平程序员三分球,但只要你的实现是基于

(寻址数据存储器/寄存器文件)< - > CPU - < - >(可寻址程序存储器)

计算的想法,你不能避免他们在执行层面。

1

难道我们需要高级语言指针?在严格的图灵机器意义上,没有。但是,实际上,我们不在Turing机器中编写代码 - 我们使用高级语言进行编码,开发人员需要某些构造来缓解编写代码的心理负担。指针使得某些抽象(例如链表)更容易表达。因此,在对“需要”一词进行最严格的解释时,答案可能不是,实际上,答案是肯定的,我们确实需要它们。

请阅读StackOverflow的常见问题。

+1

高级语言倾向于避免指针。低级别的人也会这样做。 – Pubby

+0

不,低级语言不会避免指针,尽管它们可能会避免调用它们。 –

+0

@Pubby猜测取决于你对“高级语言”的定义。我将C和C++(和Pascal就这个问题)称为“高级” - 我想你不会。 –

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#提供指针,但让我们假装它不)。

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

我们可以使用指针的函数改变不止一个变量,但有也太

对不起一个解决办法,但我不明白这个。

我们究竟需要指针吗?

是的,我们做。

0

在许多情况下,尤其是当您考虑内存消耗和程序的时间时(例如,将大型数组传递给不修改它的子程序),您需要使用指针,单向方法可能是优选的。但是,将数组传递给该函数需要将整个数组移动到子程序的本地存储区域。这在时间和空间上都是昂贵的。由于这个庞大的数组通常是通过引用传递的。

相关问题