2017-10-19 11 views
0

以下のコードをどのように解釈する必要がありますか? &arr[1]は完全に私を投げた。私はちょうど私が再帰を取得していたと考え始めました。いいえ、n = 7と言ってください。その後、最初にarr[6]printArray(6, &arr[1])printf ("%d", arr[6-1])を印刷します。
そして、それはn>0まで繰り返されます。アンパサンドを伴う再帰呼び出し関数

しかし、この再帰に2番目の要素のアドレスがどのように反映されますか。

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

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

} 

答えて

2

あなたはそれ(a)の数を減少させ、(b)は、配列の次の要素を指すようにarrを調整を呼び出すresursiveそれぞれにあるため、周りの最後の要素を毎回印刷し続ける掲示版。ここで

が順に配列全体、印刷されたバージョンです。また

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]と2番目の要素&arr [1]のアドレスとの間の相互作用を理解できません。 printfがすでにarr [0]に設定されているので、関数を呼び出すときに何が起こっていますか?最初の要素を印刷し続けるだけではありませんか? – oxodo

+0

これは、2番目の要素のアドレスを送信し、 'printArray'の2番目の呼び出しで、その要素が最初になるようにします。 cでは、arrayは最初のものへのポインタです。 – Mare70

+0

再帰呼び出しの 'arr'は呼び出し元の' arr'とは異なります。最初のバージョンでは、 '&arr [1]'が渡されています。これはちょうど 'arr + 1'です。したがって、呼び出し元の観点からは、再帰呼び出しは単に 'arr [1]'である '(arr + 1)[0]'を出力します。 –

0

Cの配列はポインタに過ぎません。 &arr[1]は、配列内の2番目の項目へのポインタです。

関連する問題