728x90
반응형

5주차 메모리에 대한 내용의 강의를 듣고 심화 과정을 해결해 보았다.

 

📌 문제 1

첫 번째 문제는 이중 포인터를 사용해서 배열의 값들을 출력하는 문제였다.
배열의 인덱스를 사용하는 것이 아닌 이중 포인터를 통해 값을 가져와야 한다.
기본 값으로 2차원 배열이 주어지고 해당 배열을 이중 포인터를 통해서 값을 출력하면 되는 문제였다.

 

주어진 2차원 배열은 다음과 같다.

Int arr[6][5] = { {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} };

 

문제를 풀기 위해서는 포인터를 이용해 배열의 값을 가져와야 하는 문제였고 포인터에 대한 이해도 필요했다.
포인터에 대해서 간단하게 그림을 그려보았다.

 

 

포인터는 가장 첫 번째의 값의 주소값을 가지고 있기 때문에 이중 배열의 첫 번째 인덱스인 arr[0][0] 의 주소를 가지고 있다.
따라서 배열의 값들은 정해진 타입의 크기를 가지면서 순서대로 값이 입력되기 때문에
포인터를 통해서 주소에 들어있는 값들을 순서대로 가져오면 된다.

 

주소값을 실제로 확인해보면 다음과 같다.

 

다음 배열의 값들은 int 형 타입이기 때문에 4 바이트씩 크기를 가지면서 순서대로 주소를 가지게 된다.

 

실제로 확인해보니 4바이트씩 순서대로 메모리에 저장된 것을 확인할 수 있었다.

 

따라서,
arr[0][0] = *(*(arr+0)+0)
arr[0][1] = *(*(arr+0)+1)
arr[0][2] = *(*(arr+0)+2)
...

와 같이 배열의 값들을 가져올 수 있다.

 

그래서 다음과 같이 문제를 해결할 수 있었다.

#include <stdio.h>

int main(void) {
    int arr[6][5] = { {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}  };
                      
    for (int i=5; i>=0; i--) {
        for (int j=0; j<5; j++) {
            printf("%d\t", *(*(arr+i)+j)); // => arr[i][j] 와 같은 의미

        }
        printf("\n");
    }
    
    return 0;
}

 

[실행 결과]

 

 

문제는 간단하게 해결할 수 있었지만
문제를 풀기 위해서 포인터에 대해서 이해하고 있어야 했기 때문에
'어떻게' 보다 '왜' 에 더 집중해서 문제를 해결하려고 했던 것 같다.

 

그래도 포인터와 더 가까워 진 것 같은 기분이다  👍

728x90
반응형
복사했습니다!