2017-10-19 1 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

당신은 그냥 (가) 수를 감소시키고 (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]과 두 번째 요소 인 & arr [1]의 주소 ​​사이의 상호 작용을 이해하지 못합니다. printf가 이미 arr [0]으로 설정되어있어 첫 번째 요소를 계속 인쇄하지 않으므로 함수가 호출 될 때 무슨 일이 발생합니까? – oxodo

+0

그 트릭은 두 번째 요소의 주소를 보내고 두 번째 호출 인'printArray'에서 요소가 먼저 오도록합니다. 왜냐하면 c에서 array는 첫 번째 포인터를 가리키는 포인터이기 때문이다. – Mare70

+0

재귀 호출의'arr'은 호출자의'arr'과 다릅니다. 첫 번째 버전에서는'& arr [1]'이 전달되는데, 이는 단지'arr + 1'입니다. 그래서 호출자의 관점에서, 재귀 적 호출은 단지'arr [1]'인'(arr + 1) [0]'을 출력합니다. –

0

C의 배열은 포인터 일뿐입니다. &arr[1]은 배열의 두 번째 항목에 대한 포인터입니다.

관련 문제