C언어의 포인터 설명 (배열 접근)

이 포스트에서는 C언어에서 포인터로 배열에 접근하는 방법을 설명합니다.

우선 다음 코드를 봅시다.
다음 코드는 2020년 정보처리기사 실기시험 문제로 출제된 바 있는 C언어 코드입니다.

#include <stdio.h>

int main()
{
    char *p = "KOREA";
    printf("%s\n", p);
    printf("%s\n", p+3);
    printf("%c\n", *p);
    printf("%c\n", *(p+3));
    printf("%c\n", *p+2);
}

이 코드는 다음과 같이 실행됩니다.

KOREA
EA
K
E
M

이렇게 나오는 이유를 설명하자면,

먼저 5번 줄에서는 문자형 포인터를 이용해 문자열 상수를 선언합니다.
6번 줄은 그 문자열 상수의 첫 부분 주소부터 시작해서 Null 문자를 만날 때까지 문자열로 출력하므로 ‘KOREA’라는 문자열이 모두 출력되고, 7번 줄은 첫 부분 주소에서 3칸 다음부터 시작해서 역시 Null 문자를 만날 때까지 출력하므로 앞의 ‘KOR’은 건너뛰고 ‘EA’를 출력합니다.
8번 줄은 그 문자열 상수 주소에 있는 값 중 첫 부분 값만 추출해서 문자로 나타내므로 첫 글자에 해당하는 ‘K’를 출력합니다.
9번 줄처럼 *(p+3)으로 지정하면 ‘그 포인터에 해당하는 주소에서 3칸 다음 주소의 값’을 의미하므로 ‘KOREA’의 ‘K’에서 3칸 다음으로 가서 ‘E’를 출력합니다.
마지막으로, 10번 줄처럼 *p+2로 지정하면 (*p)+2로 지정한 것과 같습니다. 즉 ‘그 포인터의 해당하는 주소의 값에서 2만큼 더한 값’을 의미하므로 맨 앞의 ‘K’보다 코드가 2만큼 더 큰 문자인 ‘M’을 출력하게 됩니다.

또, 다음 코드를 봅시다.

#include <stdio.h>

int main()
{
    int arr[5] = {5, 4, 3, 2, 1};
    int *p;
    p = &arr[0];
    printf("%d\n", *p);
    printf("%d\n", *(p+3));
    printf("%d\n", *p+2);
}

문자열을 정수의 배열로 바꾸었지만 앞의 코드와 대동소이합니다. 이 코드는 다음과 같이 실행됩니다.

5
2
7

이 코드의 결괏값도 앞의 코드와 마찬가지입니다. 5번 줄에서 정수 배열을 선언하면서 초기화하고 6번 줄에서 정수 포인터 변수를 선언한 뒤 7번 줄에서 그 포인터 변수가 앞서 선언한 배열을 가리키게끔 합니다.
8번 줄은 그 배열의 첫 번째 값을 가리켜서 출력하므로 ‘5’를, 9번 줄은 그 배열의 첫 번째 값에서 세 칸 다음인 네 번째 값을 출력하므로 ‘2’를, 10번 줄은 그 배열의 첫 번째 값에서 2를 더한 값을 출력하므로 ‘7’을 출력합니다.

또한,

#include <stdio.h>

int main()
{
    int arr[5] = {5, 4, 3, 2, 1};
    int *p;
    p = &arr[0];
    p++;
    printf("%d\n", *p);
    printf("%d\n", *(p+3));
    printf("%d\n", *p+2);
}

이 코드와 같이 포인터 변수에 배열의 메모리 주소를 저장한 후 8번 줄의 p++를 삽입하면 포인터가 가리키는 곳이 배열의 첫 번째 칸에서 두 번째 칸으로 한 칸 옮겨가게 되고, 그 결과는

4
1
6

이와 같이 앞의 코드에서 한 칸씩 다음으로 밀려서 그에 맞게 출력됩니다.

다만, 주의할 점이 있는데,

#include <stdio.h>

int main()
{
    int arr[5] = {5, 4, 3, 2, 1};
    int *p;
    p = &arr[0];
    printf("%d\n", *p);
    printf("%d\n", *(p+5));
}

행여 이 코드처럼 배열 포인터가 배열의 범위를 벗어나기라도 하면 쓰레기값이 출력되므로 이러한 점을 염두에 둘 필요가 있습니다.

참고로 배열 포인터는 다음과 같이 2차원 이상의 배열에도 적용할 수 있습니다.

#include <stdio.h>

int main()
{
    int arr[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};
    int *p;
    p = &arr[0][0];
    printf("%d\n", *p);
    printf("%d\n", *(p+5));
}
1
6

답글 남기기

이메일 주소는 공개되지 않습니다.