C언어를 배우다 보면 배열과 포인터가 비슷한 것처럼 느껴질 때가 많습니다.
실제로 이 둘은 밀접한 관련이 있지만, 동일한 개념은 아닙니다. 오늘은 그 차이와 관계를 정리해볼게요.
📌 배열이란?
배열은 같은 자료형의 변수들을 연속된 메모리 공간에 저장하는 자료구조입니다.
int arr[5] = {1, 2, 3, 4, 5};
- arr[0]은 배열의 첫 번째 요소
- 메모리는 연속적으로 배치됨
- 배열 이름 arr은 배열의 **시작 주소(= 첫 요소의 주소)**를 나타냄
📌 포인터란?
포인터는 메모리 주소를 저장하는 변수입니다.
int a = 10;
int *p = &a;
- p는 변수 a의 주소를 가짐
- *p는 p가 가리키는 주소에 있는 값을 의미함 (즉, a)
📌 배열과 포인터는 어떻게 연결되어 있을까?
int arr[3] = {10, 20, 30};
int *p = arr;
- arr == &arr[0]: 배열 이름은 첫 번째 요소의 주소를 의미함
- 따라서 p = arr;은 p = &arr[0];과 같음
- 배열처럼 p[1] 또는 *(p + 1)도 사용 가능
printf("%d\n", arr[1]); // 20
printf("%d\n", *(p + 1)); // 20
👉 arr[i] == *(arr + i)
👉 p[i] == *(p + i)
📌 배열과 포인터의 차이점
구분 | 배열 | 포인터 |
메모리 | 고정된 크기 | 동적으로 할당 가능 |
수정 가능성 | 배열 이름은 주소 고정 | 포인터는 다른 주소 저장 가능 |
할당 방식 | 컴파일 시 할당 | 런타임에 동적 할당 가능 (malloc) |
int arr[5];
int *p;
p = arr; // 가능
// arr = p; // 불가능! 배열 이름은 상수 포인터이기 때문
📌 배열 순회: 포인터 vs 인덱스
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]); // 배열 인덱스 방식
printf("%d ", *(arr + i)); // 포인터 방식
}
👉 위 두 방식은 완전히 같은 결과를 출력합니다. 포인터 방식이 더 빠르다고 알려져 있지만, 현대 컴파일러는 거의 차이를 없앨 정도로 최적화합니다.
📌 문자열과 배열의 포인터
char str[] = "Hello";
char *p = str;
printf("%c\n", *p); // H
printf("%c\n", *(p+1)); // e
문자열도 문자 배열이고, 첫 문자의 주소를 포인터로 받아서 사용합니다.
📌 실전 예제: 함수에 배열 넘기기
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", *(arr + i));
}
}
int main() {
int nums[5] = {1, 2, 3, 4, 5};
printArray(nums, 5);
return 0;
}
👉 배열 이름 nums는 곧 첫 번째 요소의 주소이고, int *arr로 받아 사용할 수 있습니다.
✅ 정리하며
- 배열과 포인터는 비슷하지만 다릅니다
- 배열 이름은 변하지 않는 주소값이고, 포인터는 자유롭게 주소를 바꿀 수 있는 변수입니다
- 배열을 포인터로 다룰 수 있지만, 반대로는 항상 가능하지 않습니다
- 포인터 방식은 함수 인자 전달, 메모리 절약 등에서 자주 사용됩니다
배열과 포인터는 C언어의 핵심 개념이며, 혼동하기 쉽지만 명확한 차이점이 존재합니다. 특히 함수 전달, 메모리 조작, 동적 할당 등을 다룰 때 이 두 개념을 제대로 이해하고 있어야 에러 없는 효율적인 코드를 작성할 수 있습니다.
👀 C언어 관련 포스팅을 더 보고 싶다면 아래의 포스팅을 추천드려요
[C언어] 포인터(Pointer) - 정보처리기사 실기 준비
정보처리기사 실기 준비하면서 C언어의 개념을 간단하게 잡기 위해 공부하고 있는데요. 자료구조나 연산자 등은 자바와 비슷한 맥락이기 때문에 저는 바로 포인터 개념부터 시작했습니다.C언어
dev-yeonwha.tistory.com
'C' 카테고리의 다른 글
[C언어] C언어 함수 포인터(Function Pointer) 정리 (0) | 2025.03.26 |
---|---|
[C언어] 이중 포인터(Double Pointer) 정리 (0) | 2025.03.26 |
[C언어] 포인터(Pointer) - 정보처리기사 실기 준비 (0) | 2025.03.25 |