C 언어에서 포인터와 배열의 관계 이해하기

  • 3 minutes to read

포인터와 배열은 C 언어에서 밀접하게 관련된 개념입니다. 포인터는 메모리 주소를 저장하는 변수이며, 배열은 연속적인 메모리 공간에 같은 자료형의 데이터를 저장하는 자료형입니다. 이번에는 이 두 개념을 이용하여 작성한 예제 코드를 통해, 포인터의 주소 연산과 배열의 관계를 자세히 알아보겠습니다.

아래는 포인터와 배열의 관계를 보여주는 예제 코드입니다.

코드: pointer_array_relationship.c

#include <stdio.h>

int main(void)
{
    //[1] 배열 선언
    int number[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    //[2] 3번째 인덱스부터 참조
    int* px = &number[3];

    //[3] *px == px[0] == *(px + 0)
    printf("*px: %d\n", px[0]); // 4

    //[4] *(px + 2) == px[2] : 2*4 크기만큼 주소 이동
    printf("*(px + 2): %d\n", *(px + 2)); // 6

    //[5] 4 출력 후 주소 1 증가
    printf("*px++: %d\n", *px++); // 4

    //[6] 4 위치에서 주소 1 증가 후 6 출력
    printf("*++px: %d\n", *++px); // 6

    //[7] {1, 3, 5, 7, 9, 8, 6, 4, 2, 0}     
    px = &number[3]; // 4 위치부터 다시

    //[8] px[2] == *(px + 2)
    printf("px[2]: %d\n", px[2]); // 6

    //[9] px[-2] == *(px - 2)
    printf("px[-2]: %d\n", px[-2]); // 2

    //[10] 3[px] == *(3 + px) == *(px + 3)
    printf("3[px]: %d\n", 3[px]); // 7

    return 0;
}
*px: 4
*(px + 2): 6
*px++: 4
*++px: 6
px[2]: 6
px[-2]: 2
3[px]: 7

예제 코드에서는 포인터와 배열의 관계를 보여줍니다. 먼저, number 배열을 선언하고 px 포인터를 배열의 3번째 인덱스인 number[3]의 주소로 초기화합니다. 이제 px가 가리키는 메모리 위치에 대해 여러 가지 주소 연산을 수행하면서 결과를 출력합니다.

예를 들어, *pxpx가 가리키는 메모리 위치의 값을 반환합니다. 따라서 *pxnumber[3]의 값인 4를 출력합니다. *(px + 2)px가 가리키는 위치에서 2칸 뒤에 있는 메모리 위치의 값을 반환합니다. 따라서 *(px + 2)number[5]의 값인 6을 출력합니다.

또한, *px++px가 가리키는 위치의 값을 반환한 후, px를 다음 메모리 위치로 이동시킵니다. 따라서 *px++은 먼저 4 값을 반환하고, px가 가리키는 위치가 number[4]로 이동합니다. 이후, *++pxpx가 가리키는 위치를 먼저 다음 메모리 위치로 이동시킨 후, 해당 위치의 값을 반환합니다. 따라서 *++pxnumber[5]의 값인 6을 출력합니다.

px[-2]px가 가리키는 위치에서 2칸 앞에 있는 메모리 위치의 값을 반환합니다. 따라서 px[-2]number[1]의 값인 2를 출력합니다. 마지막으로, 3[px]px가 가리키는 위치에서 3칸 뒤에 있는 메모리 위치의 값을 반환합니다. 따라서 3[px]number[6]의 값인 7을 출력합니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com