기본 패턴
c
int data[] = {10, 20, 30};
int *ptr = data;
printf("%d\n", *(ptr + 1));설명
- 포인터에 정수를 더하거나 빼면 바이트 수가 아니라 가리키는 타입의 원소 개수만큼 이동합니다.
ptr + 1은int *라면 다음int원소를 가리키고,double *라면 다음double을 가리킵니다.- 배열 인덱싱
ptr[i]는 내부적으로*(ptr + i)와 같은 의미입니다. - 같은 배열 내부 원소끼리 포인터를 빼면 두 포인터 사이의 원소 개수를 얻을 수 있습니다.
짧은 예제
c
#include <stdio.h>
int main(void) {
int values[] = {3, 6, 9, 12};
int *ptr = values;
for (int i = 0; i < 4; i += 1) {
printf("%d ", *(ptr + i));
}
printf("\n");
return 0;
}빠른 정리
| 항목 | 설명 |
|---|---|
ptr + n | n개의 원소만큼 앞으로 이동 |
ptr - n | n개의 원소만큼 뒤로 이동 |
ptr[i] | *(ptr + i)와 같은 의미 |
| 포인터 차이 | 같은 배열 안이면 원소 개수 차이를 얻을 수 있음 |
| 타입 의존 이동 | 이동 간격은 포인터 타입 크기에 따라 달라짐 |
주의할 점
포인터 산술은 같은 배열 범위 안에서만 안전하게 생각해야 합니다. 다른 객체 메모리로 넘어간 포인터를 역참조하면 정의되지 않은 동작이 됩니다.