在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. } 1。无效合并排序(int*x,int len){ 2.如果(len>1){ 3.int newLen=len/2; 4.合并排序(x,newLen); 5.合并排序(x+newLen,len-newLen); 6.int*newSeq; 7.newSeq=新整数[len]; 8.mTwoSeq(x,x+newLen,newSeq,newLen,len-newLen); 9、对于(int i=0;i

在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. } 1。无效合并排序(int*x,int len){ 2.如果(len>1){ 3.int newLen=len/2; 4.合并排序(x,newLen); 5.合并排序(x+newLen,len-newLen); 6.int*newSeq; 7.newSeq=新整数[len]; 8.mTwoSeq(x,x+newLen,newSeq,newLen,len-newLen); 9、对于(int i=0;i,c++,pointers,mergesort,C++,Pointers,Mergesort,行4和5,将数组作为两个“半部”,每个都将通过递归调用进行排序。第5行调用的第一个参数( x+NeNLeN)是计算元素的地址,该数组的地址大致在数组的中间,因为 NeLLeN是(大约)长度的一半。(我粗略地说)这里是“关于”,因为这取决于len的原始值是奇数还是偶数。) 您认为x+newLen正在使用“指针算法”是正确的,因为x是一个指针。假设系统上的int的大小是4字节,那么作为一个例子,如果newLen是12,则执行x+newLen操作产生的指针实际上是内存中比原始值大48的地址x的ue(因

行4和5,将数组作为两个“半部”,每个都将通过递归调用进行排序。第5行调用的第一个参数(<代码> x+NeNLeN<代码>)是计算元素的地址,该数组的地址大致在数组的中间,因为<代码> NeLLeN<代码>是(大约)长度的一半。(我粗略地说)这里是“关于”,因为这取决于
len
的原始值是奇数还是偶数。)

您认为
x+newLen
正在使用“指针算法”是正确的,因为
x
是一个指针。假设系统上的
int
的大小是4字节,那么作为一个例子,如果
newLen
是12,则执行
x+newLen
操作产生的指针实际上是内存中比原始值大48的地址
x
的ue(因为指针算法考虑了指向的元素类型的大小)。这意味着
x+newLen
指向从数组开始的12个点的整数


<>最后,上面的注释是纠正你的错误。<代码> x>代码>不是指针数组,而是指向整数的指针,它可能在数组的第一个点(或子数组)中要被排序。

C++中的一个不寻常的事情是当你声明一个数组时,像这样:

int a[5]

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

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


是允许的。由于指针可以同时指向变量和数组元素,如果您编写p[1],编译器将假定p指向数组,这在本例中是正确的,因此p[1]是与[1]相同的数组元素。*(p2-1)和p2[-1]都将同一数组元素引用为[0]在本例中,

x
不是指针数组。它是指向
int
的指针,可以指向数组的元素,也可以不指向数组的元素。只有某些表达式执行您描述的转换;
&a
大小a
都是这样的表达式示例not@M.M是的,sizeof是个例外在完全准确和以细节压倒一切的新手之间是很困难的。