2017-10-19 131 views
0

我该如何处理下面的代码? &arr[1]完全抛弃了我。我刚开始认为我得到了递归。说n = 7。然后它将首先打印出arr[6],然后printArray(6, &arr[1]),printf ("%d", arr[6-1])
它会重复只要n>0带&符的递归调用函数

但是第二个元素的地址是如何进入这个递归的。

void printArray(int n, int arr[]){ 

    if(n>0){ 
      printf("%d", arr[0]); 
      printArray(n-1, &arr[1]); 
    } 

} 

回答

2

您发布将只保留每次围绕打印的最后一个元素,因为每个resursive称之为(一)降低计数和(b)调整arr指向数组中的下一个元素的版本。

下面是将打印整个阵列,为了一个版本:

void printArray(int n, int arr[]) 
{ 
    if (n > 0) { 
     printf("%d", arr[0]); 
     printArray(n-1, &arr[1]); 
    } 
} 

或者,你可以先递归:

void printArray(int n, int arr[]) 
{ 
    if (n > 0) { 
     printArray(n-1, arr); 
     printf("%d", arr[n-1]); 
    } 
} 

我使用了你在你的例子有同样的格式说明,但请注意,使用此格式的一个元素与下一个元素之间没有分隔。您可能需要在最后添加空格或换行符。

+0

我真的不明白arr [0]和第二个元素&arr [1]的地址之间的相互作用。当它调用函数时发生了什么,因为printf已经被设置为arr [0],它会不会继续打印第一个元素? – oxodo

+0

这就是诀窍,你发送第二个元素的地址,并在第二次调用'printArray'时该元素将是第一个。因为在c中,数组是指向第一个的指针。 – Mare70

+0

请记住,递归调用中的'arr'与调用者中的'arr'不同。在第一个版本中,正在传递'&arr [1]',这只是'arr + 1'。所以从调用者的角度来看,递归调用是打印'(arr + 1)[0]',这只是'arr [1]'。 –

0

C中的数组只是指针。 &arr[1]是指向数组中第二项的指针。