C언어를 처음 배우다 보면 포인터와 배열의 관계에 대해 헷갈리기 쉽습니다. 특히 포인터 변수가 배열처럼 사용될 수 있다는 점은 개념적으로 이해가 필요하죠. 오늘은 포인터와 배열의 관계, 그리고 포인터 연산의 기본 개념을 간단하고 명확하게 정리해보겠습니다.
📌 I. 포인터와 배열의 관계
✅ 배열의 이름 = 상수 형태의 포인터
- C언어에서 배열의 이름은 배열의 시작 주소 값을 의미합니다.
- 하지만 그 형태는 값이 바뀌지 않는 상수 포인터입니다. 즉, 주소 값을 가리키기만 하고 변경은 불가능합니다.
int arr[3] = {1, 2, 3};
printf("%p\n", arr); // arr은 배열의 첫 요소 주소 출력
✅ 배열의 이름도 * 연산 가능
- 배열 이름도 포인터처럼 동작하므로 *arr도 유효하며, 이는 arr[0]과 같은 의미입니다.
✅ 포인터 변수도 배열처럼 사용 가능
- 포인터 변수는 배열처럼 인덱스로 접근할 수 있습니다.
int *ptr = arr;
printf("%d\n", ptr[1]); // arr[1]과 동일한 동작
📊 포인터 변수와 배열 이름 비교
항목 | 포인터 변수 (ptr) | 배열의 이름 (arr) |
이름 존재 여부 | 있음 | 있음 |
저장하는 값 | 메모리 주소 값 | 메모리 주소 값 |
주소 값 변경 가능 여부 | 가능 (ptr++ 가능) | 불가능 (상수 포인터 형태) |
📌 II. 포인터 연산의 개념
✅ 포인터 연산은 자료형 기준
- 포인터 연산은 단순한 숫자 증가가 아니라, 자료형의 크기만큼 이동합니다.
int *ptr;
ptr + 1 // 4바이트 이동 (int 기준)
✅ 배열 인덱스와 포인터 연산은 동일하게 동작
arr[i] == *(arr + i) // 항상 성립
ptr[i] == *(ptr + i) // 포인터 변수도 동일
✅ ++ 연산자와 포인터 연산의 차이점
- *(++ptr) : 포인터 주소 자체가 한 칸 증가된 후, 그 주소의 값을 참조
- *(ptr + 1) : 주소 자체는 유지되지만, 그 다음 칸의 값을 참조
int arr[3] = {10, 20, 30};
int *ptr = arr;
printf("%d\n", *(++ptr)); // 20
ptr = arr; // 초기화
printf("%d\n", *(ptr + 1)); // 20, 하지만 ptr 자체는 그대로
예제
문제 1
길이가 5인 int형 배열 arr을 선언하고 이를 1, 2, 3, 4, 5로 초기화한 다음, 이 배열의 첫 번째 요소를 가리키는 포인터 변수 ptr을 선언한다. 그 다음 포인터 변수 ptr에 저장된 값을 증가시키는 형태의 연산을 기반으로 배열요소에 접근하면서 모든 배열요소의 값을 2씩 증가시키고, 정상적으로 증가가 이뤄졌는지 확인하는 예제를 작성해보자.

문제 2
문제 1에서는 포인터 변수 ptr에 저장된 값을 변경시켜가면서 배열요소에 접근하라고 하였다. 그런데 이번에는 포인터 변수 ptr에 저장된 값을 변경시키지 않고, ptr을 대상으로 덧셈연산을 하여, 그 결과로 반환되는 주소 값을 통해서 모든 배열요소에 접근하여 값을 2씩 증가시키는 예제를 작성해보자.

문제 3
길이가 5인 int형 배열 arr을 선언하고 이를 1, 2, 3, 4, 5로 초기화한 다음, 이 배열의 마지막 요소를 가리키는 포인터 변수 ptr을 선언한다. 그 다음 포인터 변수 ptr에 저장된 값을 감소시키는 형태의 연산을 기반으로 모든 배열요소에 접근하여, 배열에 저장된 모든 정수를 더하여 그 결과를 출력하는 프로그램을 작성해보자.

문제 4
길이가 6인 int형 배열 arr을 선언하고 이를 1, 2, 3, 4, 5, 6으로 초기화한 다음, 배열에 저장된 값의 순서가 6, 5, 4, 3, 2, 1이 되도록 변경하는 예제를 작성해보자. 단, 배열의 앞과 뒤를 가리키는 포인터 변수 두 개를 선언해서 이를 활용하여 저장된 값의 순서를 뒤바꿔야 한다.

💡 마무리 정리
- 배열의 이름은 상수 형태의 포인터로서, 값을 저장하거나 변경할 수는 없습니다.
- 포인터 변수는 주소 값을 자유롭게 바꿀 수 있으며 배열처럼 사용할 수 있습니다.
- 포인터 연산은 자료형 크기를 기준으로 주소 이동이 발생하므로 메모리 구조를 잘 이해하는 것이 중요합니다.
'공부 > C언어' 카테고리의 다른 글
[C언어] 함수와 배열, 그리고 포인터의 관계 정리, 함수의 호출방식 (0) | 2025.05.11 |
---|---|
[C언어] 포인터 상수 형태의 문자열과 포인터 배열 개념 정리 (0) | 2025.05.11 |
[C언어] 포인터의 이해 (0) | 2025.05.08 |
<C언어: 배열을 이용한 문자열 변수의 표현> (0) | 2025.05.07 |
<C언어: 배열의 이해와 배열의 선언 및 초기화 방법> (0) | 2025.05.06 |