포인터 가이드 : 다중 포인터 다루기

  • 변수 포인터의 가장 적절한 예는 배열과 문자열이다. 배열의 가장 앞 원소(element)의 주소는 배열의 시작 주소와 동치다. char형의 배열은 곧 문자열이다. 맨 앞 문자의 주소는 문자열의 시작 주소와 동치다.
  • 이러한 배열 자체를 원소로 삼아 또 다른 배열을 만들 수 있다. 어렵게 생각할 것 없이 아래 도식을 보자.
  • 각각 요소 3개를 가진 배열 4개의 주소를 담고 있는 배열. 이게 전부 다다.
  • *를 두개 선언함으로써 배열주소를 담은 배열을 만들 수 있다. 아래 도식을 추가로 보자.
  • malloc으로 실제 동적 할당과 배열이 어떻게 이루어지는지 그려봤다. malloc앞의 형변환은 명시해주면 좋을것이다.
  • 아래는 실제로 사용하는 방법이다
int **ptr = (int **)malloc(sizeof(int *) * 4);
int i = 0;
while (i < 3)
{
    *(ptr + i) = (int *)malloc(sizeof(int) * 3);
    i++;
}
  • 당연하지만 배열방식으로도 가능하다
  • 순회 할 때는 연산자 우선순위를 주의해서 순회하면 된다.
int i, j;
i = 0;
while (i < 3)
{
    j = 0;
    while (j < 3)
    {
        *(*(ptr + i) + j) = i * 3 + j;
        j++;
    }
    i++;
}

i = 0;
j = 0;
while (i < 3)
{
    j = 0;
    while (j < 3)
    {
        printf("%d ", *(*(ptr + i) + j));
        j++;
    } 
    printf("\n");
    i++;
}
  • 아래는 실행 결과다
0 1 2 
3 4 5 
6 7 8 
  • 사실 나도 너무 어렵게 생각해서 정리해본 글이다.
  • (추가자료)

Comments