2010-11-27 61 views
7

在一些COMP-SCI论文和考试,我看到交换()像这样实现的:为什么swap()有时通过传递数组来实现?

void swap(int x, int y, int *a) 
{ 
    int t = a[x]; 
    a[x] = a[y]; 
    a[y] = t; 
} 

为什么不能简单地实现它,像这样:

void swap(int& x, int& y) 
{ 
    int t = x; 
    x = y; 
    y = t; 
} 

的理念是前者使调用代码更清洁,不必索引到前两个参数的数组?我意识到这不是一个非常重要的问题,因为我们应该使用std :: swap(),但我仍然好奇。

回答

6

并非所有的编程语言都支持通过引用进行调用。例如,后一种做法swap的方式不适用于Java。

在包含伪代码的书籍中,通常有一个约定,数组和指针在传递时不会被复制,而其他所有内容都在函数调用中被复制。前一种方式不需要关于参数传递方式的特别解释。

关于清洁的最后一点,它并没有太大的不同:在前一种情况下,您的交换电话将是:swap(i, j, a);而在后者中,您必须swap(a[i], a[j]);,在表达式中引入一些括号。

+1

Java?它是一种编程语言吗? ;) – ybungalobill 2010-11-27 21:37:33

+0

在Java的情况下,它不仅仅是引用调用,而且不支持中缀指针。大多数(所有?)垃圾收集语言禁止它们,因为它们处理GC是一团糟。这些语言自然会促使您按照问题中的第一个片段的样式进行书写。 – 2010-11-27 21:38:19

2

您的第二个代码示例是C++,而不是C. C++支持引用参数,但C仅通过指针间接支持引用。

我同意第二个实现更清洁。为了使它在C中工作,请将&中的每个参数更改为*,并在函数内部将每个xy(也包含*)解引用。

相关问题