在函数中交换两个数组的指针
我正在编写一个没有复制部分的mergesort到一个额外的临时数组。 出于这个原因,我创建了一个辅助arraysaux
int * aux aux = (int *) calloc(n, sizeof(int));
其中n
是数组的大小。 在函数合并中,我想通过使用指针继续我的算法来在最后交换两个数组。 但是,如果我交换指针,并将它们打印到控制台,我得到了奇怪的东西:
在方法本身内,指针被交换。 但是,如果我检查我的方法,回到我的主,指针不再交换。 调用我的合并方法:
merge(a, lo, mid, hi, aux);
其中a
是我的主arrays,辅助和lo
, mid
和hi
是整数。
原型:
void merge(int *a, int lo, int mid, int hi, int *aux);
我试图像这样交换它们:
int temp; temp = a; a = aux; aux = temp;
你能帮我解决这个问题吗?
提前致谢!
发生错误是因为指针是按值传递的。
将它们更改为指针指针:
void merge(int **a, int lo, int mid, int hi, int **aux);
像这样交换:
int *temp; temp = *a; *a = *aux; *aux = temp;
然后应该像这样调用merge
:
merge(&a, lo, mid, hi, &aux);
我可以发现你的方法有两个不同的问题:
1)为什么使用int临时变量来交换int *指针? 如果sizeof(int)!= sizeof(int *),例如64位系统,这可能会导致问题。 为什么不使用int *临时?
2)你的指针在:
void merge(int *a, int lo, int mid, int hi, int *aux);
是按值传递的,这意味着您对函数中指针值的任何更改都不会在其外部可见。 您应该使用以下方法之一:
void merge(int **a, int lo, int mid, int hi, int *aux);
要么:
void merge(int *& a, int lo, int mid, int hi, int *aux);
如果你在c ++世界。
另一件事:将aux传递给merge函数可能有点多余,因为你可以很好地在内部分配和释放它。