Programming/C
[Programming/C] 다차원 배열의 주소를 저장하는 포인터를 이용한 배열의 접근 응용
scii
2021. 1. 21. 18:23
다음은 9 X 9 배열을 포인터 변수 int (*arr)[3][3]에 저장하여 메모리에 사용하는 응용 예제이다.
#include <stdio.h>
#include <string.h>
typedef int (*ARR9)[9];
typedef int (*ARR33)[3][3];
// int (*arr)[9]
void PrintArray(ARR9 arr){
for(int i=0; i<9; i++){
for(int j=0; j<9; j++){
printf("%2d", arr[i][j]);
}
puts("");
}
puts("===============================");
}
int main(int argc, const char * argv[]) {
int arr[9][9];
ARR33 arr33;
memset(arr, 0, sizeof(int) * 9 * 9);
PrintArray(arr);
// int (*arr)[3][3]
arr33 = (ARR33)arr;
for(int i=0; i<9; i++){
for(int j=0; j<3; j++){
arr33[3][i][j] = 1;
}
}
PrintArray(arr);
for(int i=0; i<9; i++){
for(int j=0; j<3; j++){
arr33[i][1][j] = 1;
}
}
PrintArray(arr);
for(int i=0; i<3; i++){
for(int j=0; j<3; j++){
arr33[3+i][1][j] = 5;
}
}
PrintArray(arr);
return 0;
}
/* 결과
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
===============================
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
===============================
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
===============================
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
1 1 1 5 5 5 1 1 1
1 1 1 5 5 5 1 1 1
1 1 1 5 5 5 1 1 1
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0 0
===============================
*/
ARR33이라는 이름은 3차원 주소의 역할을 하여 +1을 할 때, [3][3]의 행과 열을 건너뛰는 포인터 변수를 만들기 위한 형 재정의 이름이다. ARR9 이라는 이름은 2차원 주소의 역할을 하여 +1을 할 때 [9]의 열을 건너뛰는 포인터 변수를 만들기 위한 형 재정의 이름이다.
memset() 함수를 사용하여 9 X 9 메모리를 모두 0으로 초기화한다.
arr33[i][1][j] = 1 문장은 i(0~8)가 1씩 증가할 때 int형 3 X 3(9개) 만큼 건너뛰고 j(0~2)가 1씩 증가할 때 int형 1개씩 건너뛴 메모리를 1로 만든다.
arr33[3][i][j] = 1 문장은 i가 1씩 증가할 때 int형 3개씩 건너뛰고 메모리를 j가 1씩 증가할 때 int형 1개씩 건너뛴 메모리를 1로 만든다.
arr33[3+i][1][j] = 5 문장은 i가 1씩 증가할 때 int형 3 X 3(9개) 만큼 건너뛰고 j가 1씩 증가할 때 int형 1개씩 건너뛴 메모리를 5로 만든다.