2014-11-29 2 views
0

두 개의 2 차원 배열 (부호없는 포인터에 대한 포인터)이 있고이를 서로 바꾸려고합니다. 먼저 포인터의 1 차원 배열에 대한 코드를 작성하기 시작했습니다. 이 완벽하게 작동합니다 :C에서 2 차원 배열 (포인터로 포인터) 바꾸기

#include <stdio.h> 
#include <stdlib.h> 

void swap(unsigned **a, unsigned **b) { 
    unsigned * tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

int main() { 
    size_t x; 
    unsigned *a = (unsigned*) malloc(10*sizeof(unsigned)); 
    unsigned *b = (unsigned*) malloc(10*sizeof(unsigned)); 

    for(x=0;x<10;x++) a[x] = 1; 
    for(x=0;x<10;x++) b[x] = 0; 

    printf("%u %u\n",a[5],b[5]); 
    swap(&a, &b); 
    printf("%u %u\n",a[5],b[5]); 
    return 0; 
} 

가 나는 2 차원 배열 비슷한 작업을 수행 할 수 있습니다 생각했다.

#include <stdio.h> 
#include <stdlib.h> 

void swap(unsigned ***a, unsigned ***b) { 
    unsigned ** tmp = **a; 
    **a = **b; 
    **b = tmp; 
} 

int main() { 
    size_t x,y; 
    unsigned **a = (unsigned**) malloc(10*sizeof(unsigned*)); 
    unsigned **b = (unsigned**) malloc(10*sizeof(unsigned*)); 
    for(x=0;x<10;x++) 
    { 
    a[x] = malloc(10*sizeof(unsigned)); 
    b[x] = malloc(10*sizeof(unsigned)); 
    } 

    for(x=0;x<10;x++) for(y=0;y<10;y++) a[x][y] = 1; 
    for(x=0;x<10;x++) for(y=0;y<10;y++) b[x][y] = 0; 

    printf("%u %u\n",a[5][5],b[5][5]); 
    swap(&a, &b); 
    printf("%u %u\n",a[5][5],b[5][5]); 
    return 0; 
} 

나는 두 개의 컴파일러 경고를 가지고 : 여기 내 시도이다

$ gcc -g -Wall test.c 
test.c: In function ‘swap’: 
test.c:5:21: warning: initialization from incompatible pointer type [enabled by default] 
test.c:7:7: warning: assignment from incompatible pointer type [enabled by default] 

내가 경고를 이해하려고하지만, 난 여전히 그들을 이해하지 않습니다. 내 코드에서 무엇이 잘못되었는지 전혀 모른다. 당신의 swap 기능에

+1

으로 변경 '서명되지 않은 ** tmp = * a; * a = * b; * b = tmp;' – BLUEPIXY

답변

1

너무 많은 derefencings는 :

void swap(unsigned ***a, unsigned ***b) { 
    unsigned ** tmp = *a; 
    *a = *b; 
    *b = tmp; 
} 

당신은 당신이 한 번만 역 참조에 (원래의 기능과 동일)가 필요하므로, 포인터의 콘텐츠에 액세스 할 수 있습니다.

+0

대단히 감사합니다! – Sebastian

+0

반갑습니다. – didierc

0

포인터를 바꿔 넣기 만하면 *aa[][]의 위치를 ​​나타냅니다. @didirec이 말했듯이, 너무 많은 derefences !!