Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
05-17 00:00
관리 메뉴

nomad-programmer

[Programming/C] 다차원 배열의 주소를 저장하는 포인터를 이용한 배열의 접근 응용 본문

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로 만든다.

Comments