그 외/정보처리기사

이중 포인터와 주소 값, 이중 배열 예제

CBJH 2024. 7. 26. 22:46
728x90
반응형

1. 이중 포인터 (Double Pointer)

이중 포인터는 포인터를 가리키는 포인터입니다. 기본적인 개념부터 시작해서 단계별로 설명해보겠습니다.

예시 코드

#include <stdio.h>

int main() {
    int x = 10;
    int *p = &x;       // 'p'는 'x'의 주소를 가리킵니다.
    int **pp = &p;     // 'pp'는 'p'의 주소를 가리킵니다.

    printf("x의 값: %d\n", x);       // 출력: 10
    printf("p가 가리키는 값: %d\n", *p);  // 출력: 10
    printf("pp가 가리키는 값: %d\n", **pp); // 출력: 10

    printf("x의 주소: %p\n", (void*)&x);    // x의 주소 출력
    printf("p의 주소: %p\n", (void*)&p);    // p의 주소 출력
    printf("pp의 주소: %p\n", (void*)&pp);  // pp의 주소 출력

    printf("p가 가리키는 주소: %p\n", (void*)p);   // p가 가리키는 주소 출력 (x의 주소)
    printf("pp가 가리키는 주소: %p\n", (void*)pp); // pp가 가리키는 주소 출력 (p의 주소)

    return 0;
}

설명

  • x는 정수형 변수입니다.
  • p는 x를 가리키는 포인터입니다. 즉, p는 x의 주소를 저장합니다.
  • pp는 p를 가리키는 이중 포인터입니다. 즉, pp는 p의 주소를 저장합니다.
  • 이중 포인터를 사용하면 포인터의 포인터에 접근할 수 있습니다.

2. 주소값 (Address Value)

포인터는 다른 변수의 주소를 저장하는 변수입니다. 주소값을 통해 변수에 직접 접근할 수 있습니다.

예시 코드

#include <stdio.h>

int main() {
    int y = 20;
    int *py = &y;

    printf("y의 값: %d\n", y);        // 출력: 20
    printf("y의 주소: %p\n", (void*)&y); // y의 주소 출력
    printf("py의 값: %p\n", (void*)py);  // py의 값 출력 (y의 주소)
    printf("py가 가리키는 값: %d\n", *py); // 출력: 20

    return 0;
}

설명

  • y는 정수형 변수입니다.
  • py는 y의 주소를 가리키는 포인터입니다.
  • py를 통해 y의 값을 간접적으로 접근할 수 있습니다.

3. 이중 배열 (2D Array)

이중 배열은 배열의 배열입니다. 행과 열로 이루어진 2차원 배열입니다.

예시 코드

#include <stdio.h>

int main() {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int i, j;

    for (i = 0; i < 2; i++) {
        for (j = 0; j < 3; j++) {
            printf("arr[%d][%d]의 값: %d\n", i, j, arr[i][j]);
        }
    }

    return 0;
}

설명

  • arr은 2x3 크기의 2차원 배열입니다.
  • 배열의 각 요소에 접근할 때는 arr[i][j]와 같은 방식으로 접근합니다.
  • arr[0][0]은 첫 번째 행의 첫 번째 열을 가리키며, arr[1][2]는 두 번째 행의 세 번째 열을 가리킵니다.

종합 예제

이제 이중 포인터와 이중 배열을 결합한 예제를 보겠습니다.

#include <stdio.h>

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*p)[3] = matrix; // 'p'는 3개의 정수를 가지는 배열을 가리키는 포인터

    printf("matrix[0][0]: %d\n", matrix[0][0]); // 출력: 1
    printf("matrix[0][1]: %d\n", matrix[0][1]); // 출력: 2
    printf("matrix[0][2]: %d\n", matrix[0][2]); // 출력: 3

    printf("matrix[1][0]: %d\n", matrix[1][0]); // 출력: 4
    printf("matrix[1][1]: %d\n", matrix[1][1]); // 출력: 5
    printf("matrix[1][2]: %d\n", matrix[1][2]); // 출력: 6

    printf("p[0][0]: %d\n", p[0][0]); // 출력: 1
    printf("p[1][2]: %d\n", p[1][2]); // 출력: 6

    return 0;
}

설명

  • matrix는 2x3 이중 배열입니다.
  • p는 3개의 정수를 가지는 배열을 가리키는 포인터입니다.
  • p를 통해 matrix의 요소에 접근할 수 있습니다.