2017-10-19 132 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]是指向數組中第二項的指針。