C 언어에서 포인터와 배열의 관계 이해하기
포인터와 배열은 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
가 가리키는 메모리 위치에 대해 여러 가지 주소 연산을 수행하면서 결과를 출력합니다.
예를 들어, *px
는 px
가 가리키는 메모리 위치의 값을 반환합니다. 따라서 *px
는 number[3]
의 값인 4를 출력합니다. *(px + 2)
는 px
가 가리키는 위치에서 2칸 뒤에 있는 메모리 위치의 값을 반환합니다. 따라서 *(px + 2)
는 number[5]
의 값인 6을 출력합니다.
또한, *px++
은 px
가 가리키는 위치의 값을 반환한 후, px
를 다음 메모리 위치로 이동시킵니다. 따라서 *px++
은 먼저 4
값을 반환하고, px
가 가리키는 위치가 number[4]
로 이동합니다. 이후, *++px
는 px
가 가리키는 위치를 먼저 다음 메모리 위치로 이동시킨 후, 해당 위치의 값을 반환합니다. 따라서 *++px
는 number[5]
의 값인 6을 출력합니다.
px[-2]
는 px
가 가리키는 위치에서 2칸 앞에 있는 메모리 위치의 값을 반환합니다. 따라서 px[-2]
는 number[1]
의 값인 2를 출력합니다. 마지막으로, 3[px]
는 px
가 가리키는 위치에서 3칸 뒤에 있는 메모리 위치의 값을 반환합니다. 따라서 3[px]
는 number[6]
의 값인 7을 출력합니다.