2017-03-12 27 views
4

我正在学习如何实现mergesort的入门C++课程。我想通过在代码中的每一步走我自己,但有一件被绊倒了我,让指针算术用作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行发生了什么?我的理解是,当我们调用“x + i”,其中x是一个指针数组时,我们要求计算机给我们存储第i条数据的内存地址。如果是这种情况,我不完全确定这是否适合这里。如果有人知道该函数调用发生了什么,我很高兴知道。谢谢!

+2

'x'不是一个指针数组。它是一个指向'int'的指针,它可能指向或不指向数组的一个元素。 – juanchopanza

回答

3

第4行和第5行将数组视为两个“半部”,然后每个部分都会通过递归调用进行排序。第5行(x + newLen)调用的第一个参数是计算(大致)位于数组中间的元素的地址,因为newLen大约是长度的一半。 (我说“大约”和“约”在这里,因为这取决于len初始值是奇数还是偶数。)

你是正确x + newLen使用“指针运算”,因为x是一个指针。假设在许多/大部分系统上都是如此,您系统上的int的大小为4个字节,那么作为示例,如果newLen是12,则执行x + newLen所产生的指针实际上将是内存中的地址, (因为指针算术考虑了被指向的元素类型的大小)。这意味着x + newLen指向从数组开始的整数12个点。

最后,上面的评论者正确地纠正你。 x不是指针数组。相反,它是一个指向整数的指针,它大概在要整理的整数数组(或子数组)中的第一个位置。

0

约C++(和C)一种不寻常的是,当你声明一个数组,像这样:

INT一个[5];

名称'a'实际上相当于&(a [0]),该数组的第一个元素的地址。也就是说,当你在表达式中使用'a'时,它是一个指针值,而不是一个变量值。所以你可以使用指针算术就可以了。所以a + 1将相当于&(a [1])。这就是为什么这样的陈述:

int * p = a,* p2 = a + 1;

是允许的。因为指针可以指向变量和数组元素,所以如果你编写p [1],编译器会假设p指向一个数组,在这个例子中它是正确的,所以p [1]和a [ 1]。 *(p2-1)和p2 [-1]在本例中都指向与[0]相同的数组元素。

+0

只有某些表达式执行您描述的转换; '&a'和'sizeof a'是表达式的例子,不是 –

+0

@ M.M是的,sizeof是一个例外。完全精确和压倒性的新细节之间的折衷是一个难题。 – WaltK