2012-09-09 3 views
1

그래서 내가 지금 C를 배우려고 노력하고있어, 나는 두 가지 기능을 가지고 : 배열의 요소를 이동 하나쉬프트 요소 - 포인터 기반

void shift(int a[], int n) { 
    int i; 
    for(i = 0; i != n-1; i++){ 
     a[i] = a[i+1]; 
    } 
} 

및 버전 제외하고는 동일한 기능의 포인터 기반 :

void pointer_shift(int *a[], int n) { 
    int i; 
    for (i = 0; i != n - 1; i++) { 
     *a[i] = *a[i + 1]; 
    } 
} 

내가 포인터 기반 버전이 올바른지 아닌지 모르겠지만, 내 가장 중요한 질문은 내가 실제로 있는지 테스트하는데있어 어떻게 생각 둘 다/일하다. 두 함수의 정의 외에도, 내가 가진 :

#include <stdio.h> 

void shift(int a[], int n); 
void pointer_shift(int *a[], int n); 

int main(void) { 
    printf("Begin execution of testing Problem 1\n"); 
    int a1[] = {100, 101, 102}; 
    int i; 
    for(i = 0; i<3;i++) 
     printf("Before Shift: " "%d\n", a1[i]); 
    //shift(a1, 3); 
    pointer_shift(&a1, 3); 
    for(i = 0; i<3;i++) 
     printf("After Shift In Main: " "%d\n", a1[i]); 
    return 0; 
} 

변화를 (A1은, 3)

잘 작동하지만, 내 인생, 어떻게 알아낼 수 없습니다 pointer_shift를 올바르게 테스트하십시오.

두 개의 오류가 발생합니다. 하나는 그 라인

pointer_shift (& A1, 3)

I 호환되지 않는 포인터 타입에서 1 인자를 전달하고있다. 다른 오류는 해독 할 수 없지만 누군가가 나를 도울 수있을만큼 문제가 분명하기를 희망했습니다. 그럼 ... 내 두 가지 기능을 테스트하는 방법?

감사합니다.

+0

이 주제는 꺼져 있습니다.하지만 C++ 11을 사용하는 경우 배열에 대한 포인터보다 std :: array를 사용하는 것이 좋습니다. –

답변

3
은 다음과 같이 포인터를 기반으로 기능을 변경

: 당신이 main에서 배열을 전달하는 반면 당신이 받고있는 것은 포인터의 배열 인

void pointer_shift(int *a, int n) { 
    int i; 
    for (i = 0; i != n - 1; i++) { 
     *(a+i) = *(a+i+1); 
    } 
} 

. 배열이 포인터로 붕괴하기 때문에 여기서 shift(a1, 3)을 호출하면 충분합니다.

2

변경 함수 프로토 타입은

a[1] = 4; 

당신은 아직도 그것을 호출 할 수 있습니다와 같은 인이

*(a+1) = 4; 

같은 int*

void pointer_shift(int *a, int n) 

다음 액세스 배열 요소를 적용합니다 배열이 pointe로 감쇠하기 때문에 array 변수를 사용하는 동일한 방법 함수를 매개 변수로 전달할 때 첫 번째 요소로 이동

+0

도움을 주셔서 감사합니다! –

-1

첫 번째 함수는 이미 포인터 기반입니다. int[] 유형의 함수 매개 변수를 정의하면 컴파일러는 포인터 유형 int*을 정의한 것과 동일하게 취급합니다. 따라서 함수는 포인터 또는 배열 (자동으로 포인터로 형변환 됨) 중 하나를 전달할 수 있습니다.

int a[] 대신 int *a을 받아들이도록 함수 프로토 타입을 변경하면 함수가 완전히 동일하게 작동합니다.

두 번째 함수는 원하는 포인터가 아닌 int에 대한 포인터 배열을 필요로하므로 작동하지 않습니다.

0
int main(void) { 
    printf("Begin execution of testing Problem 1\n"); 
    int a1[] = {100, 101, 102}; 
    int *array_of_pointers[3]; 
    int i; 

    array_of_pointers[0]= &a1[0]; 
    array_of_pointers[1]= &a1[1]; 
    array_of_pointers[2]= &a1[2]; 

    for(i = 0; i<3;i++) 
     printf("Before Shift: " "%d %p\n ", a1[i], array_of_pointers[i]); 

/* 
    same as passing a1, the address of the array is 
    the same value as the value of the array, just a different type 
*/ 
    pointer_shift(array_of_pointers, 3); 
    printf("After Shift, note that array_of_pointers has not shifted:\n"); 
    for(i = 0; i<3;i++) 
     printf("After Shift In Main: " "%d %p\n", a1[i], array_of_pointers[i]); 
    return 0; 
} 

pointer_shift 포인터들의 어레이 INT 아닌 배열을 기대하고있다. 여기서 "shift"는 배열에 없지만 배열의 요소가 가리키는 값이 인 경우 배열 요소의 값은 동일하게 유지됩니다!