프로그래밍

 3198, 1/160 회원가입  로그인  
   박영민
   [포인터]C언어 질문

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=6447 [복사]


#include <stdio.h>

void RightNinety(int (*pArr)[4], int (*pArr)[4], int size);

int main(void)
{
        int arr1[4][4]={
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12},
                {13, 14, 15, 16}
        };
        int arr2[4][4];
        int i;

        for(i=0;i<4;i++)
                RightNinety(arr1, arr2, sizeof(arr)/sizeof(arr[0]));
        
        return 0;
}

void RightNinety(int (*pArr)[4], int (*pArr)[4], int size)
{
        int i, j;
        int *A=pArr1;
        int *B=pArr2;

        for(i=0;i<size;i++)
                for(j=0;j<size;j++)
                        B[i][3-j]=A[i][j];
        for(i=0;i<size;i++)
                for(j=0;j<size;j++)
                        printf("%d ", B[i][j]);
}

이 문제는 이차원 배열을 오른쪽으로 90도 회전하는 것임.

Q1. 함수 RightNinety에서 포인터 변수 A와 B를 선언했는데 2차원 배열이니까 이중 포인터로 받는 게 맞는 것인지?

Q2. 함수 RightNinety에서 printf 함수 출력 시 인자로 B[i][j]를 전달하는 것이 맞는지? 만약 *B[i][j]로 인자를 전달 받는다면 어떻게 되는지?

Q3. 컴파일이 되지 않는 관계로 어떤 부분이 오류가 나는 지 모르겠는데, 상세히 가르쳐 주실 분이 있으면 감사합니다. 부족한 부분이나 센스도 알려주시면 감사하겠습니다.

  Hit : 4881     Date : 2014/03/12 09:00



    
hackartist 많은 설명이 필요하겟네요. ㅎ 자세한 부분은 hackartist.anon@gmail.com으로 연락주세요 ㅎ

A1. 배열=포인터 이 원리에 의하면 2차원 배열이니깐 이중포인터에 넣으면 된다 라고 생각할수 있지만, 조금 다릅니다 배열은 엄밀히 말하면 const pointer 이중 배열의 의 경우 위에서는 [4][4] 는 타입으로 말하면 *[4] 뒤의 배열의 갯수가 정해진 이중 포인터 인것이죠. 그래서 타입 캐스팅이 안됩니다. 따라서 이거는 사용용도에 따라 나눠지겠는데, 위의 용도에서는 int **A=(int**)pArr1; 과 같이 고쳐주는게 맞겠네요.(물론 이경우 버퍼오버플로우 고려해야겠죠. )나머지 내용 생략.

A2. 현재 B는 그냥 * 기 때문에 일차원적으로 봐야하고요. 이중 포인터 int **B로 선언되었다고 가정하고 설명할게요. 이때 B[i][j]는 정상출력될거고요. *B[i][j]는 타입오류 날겁니다. 만약 *(int*)B[i][j] 를 할경우 런타임에 스택어버플로우 오류 또는 쓰레기값(아주 낮은확률) 출력될 수 있습니다. 나머지는 길어서 생략..

A3. 우선 RightNinety파라미터에 이름이 첫번째와 두번째가 동일하고요. main에서 sizeof(arr) 여기서 arr 변수는 없는 변수기때문에 컴파일 오류 날거 같네요. 두번째 sizeof(arr[0])도 마찬가지.
2014/04/22  
박영민 답변 감사합니다. 2014/04/26