2차원 배열를 1차원으로 접근, 1차원 배열을 2차원으로 접근.
1차원, 2차원 배열은 컴퓨터 메모리에 저장은 일차원으로 저장이 된다.(일차원과 같은 연속적이 메모리에 저장)
[Source Code 0]
:
int multi0[3][4] = { {1,2,3,4} , {5,6,7,8} , {9,10,11,12} };
int multi1[10] = {1,2,3,4,5,6,7,8,9,10};
int *Arr0, (*Arr1)[5];
Arr0 = (int *) multi0;
Arr1 = (int (*)[5]) multi1;
printf("[Array] %d : %d : %d\n", Arr0[6], *(Arr0+6), multi0[1][2]);
printf("[Array] %d : %d : %d\n", Arr1[1][1], *(*(Arr1+1)+1), multi1[6]);
:
[Result]
[Array] 7 : 7 : 7
[Array] 7 : 7 : 7
계속하려면 아무 키나 누르십시오 . . .
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
multi0은 2차원 배열 선언이 되어있다.
Arr0 = (int *)multi0;
일차원으로 캐스트해서 사용. Arr0[0] 이와 같이 접근가능하다. multi0[0][0] 이렇게 접근할 수 있음.
multi1은 1차원 배열 선언이 되어있다.
int (*Arr1)[5];
Arr1 = (int (*)[5])multi1;
위와 같이 포인터 선언후. (int (*)[5]) 캐스트하여 사용, Arr1[0][0] 이와 같이 접근이 가능하다.
포인터 선언 후 배열을 캐스트하여 접근할 수 있는 방법이다. 위의 예제를 참고...
아래와 같은 코드도 사용할 수는 있겠지만. 특별한 처리가 아니라면 위의[Source Code 0] 사용하세요.
[Source Code 1]
:
int code0[10];
int code1[2][5] = {1,2,3,4,5,6,7,8,9,10};
for(int i=0; i<2; i++)
{
for(int j=0; j<5; j++)
{
code0[i*5+j] = code1[i][j];
}
}
for(int i=0; i<10; i++) printf("%d ", code0[i]);
:
[Result]
1 2 3 4 5 6 7 8 9 10 계속하려면 아무 키나 누르십시오 . . .
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
for 루프 부분을 memcpy() 함수로 하나로 할 수 있지만....
이러한 메모리 복사가 필요없다면 [Source Code 0] 위의 코드를 사용할 수 있습니다.