我正在学习如何实施mergesort的入门c ++课程。我试图自己完成代码中的每一步,但有一件事让我沮丧:
1. void mergeSort(int *x, int len){
2. if (len>1){
3. int newLen=len/2;
4. mergeSort(x, newLen);
5. mergeSort(x+newLen,len-newLen);
6. int *newSeq;
7. newSeq=new int[len];
8. mTwoSeq(x, x+newLen, newSeq,newLen, len-newLen);
9. for(int i=0;i<len;++i){
10. x[i]=newSeq[i];
11. }
12. delete[] newSeq;
13. }
14. }
第5行发生了什么?我的理解是,当我们打电话给&#34; x + i&#34;其中x是一个指针数组,我们要求计算机给我们保存第i个数据的内存块的地址。如果是这种情况,我不完全确定这是如何适应的。如果有人知道该函数调用中发生了什么,我很高兴知道。谢谢!
答案 0 :(得分:3)
第4行和第5行将数组视为两个&#34;一半&#34;然后将通过递归调用对每个进行排序。第5行(x + newLen
)上调用的第一个参数是计算(大致)在数组中间的元素的地址,因为newLen
是(大约)长度的一半。 (我说&#34;粗略&#34;和#34;关于&#34;这里因为这取决于len
的原始值是奇数还是偶数。)
x + newLen
正在使用&#34;指针算术&#34;你是正确的,因为x
是一个指针。假设,就像许多/大多数系统上的强制转换一样,系统上int
的大小是4个字节,那么作为一个例子,如果newLen
是12,则执行x + newLen
的指针1}}实际上是内存中的地址 48 大于x
的原始值(因为指针算法会考虑指向的元素类型的大小)。这意味着x + newLen
指向距离数组开头的整数12个点。
最后,上述评论者纠正你是对的。 x
不是指针数组。相反,它是一个指向整数的指针,它可能位于要排序的整数数组(或子数组)的第一个位置。
答案 1 :(得分:0)
关于C ++(和C)的一个不同寻常的事情是,当你声明一个数组时,就像这样:
int a [5];
名称&#39; a&#39;实际上相当于&amp;(a [0]),即数组第一个元素的地址。也就是说,当你使用&#39; a&#39;在表达式中,它是指针值,而不是变量值。所以你可以在它上面使用指针算术。因此a + 1将等同于&amp;(a [1])。这就是为什么这样的声明:
int * p = a,* p2 = a + 1;
是允许的。由于指针可以指向变量和数组元素,如果你编写p [1],编译器会假设p指向一个数组,在这个例子中是正确的,所以p [1]是一个与[a]相同的数组元素1]。 *(p2 - 1)和p2 [-1]在本例中都指向与[0]相同的数组元素。