본문 바로가기
프로그래밍/C언어

C언어 배열과 포인터의 관계, 진짜 제대로 이해해보자!

by 밤이씌 2025. 3. 23.

C언어 배열과 포인터의 관계, 진짜 제대로 이해해보자!

"배열은 포인터다?" 누가 그렇게 말하던데... 정말 그 말이 맞을까요?

안녕하세요, 개발자 여러분! 저는 요즘 C언어 강의를 준비하면서 학생들이 가장 많이 헷갈려하는 부분을 정리해보자는 생각이 들었어요. 특히 배열과 포인터 부분은 C언어 학습에서 진입장벽 중 하나인데요, 저도 처음에는 "어, 이게 왜 이렇게 동작하지?" 하면서 헤맸던 기억이 생생해요. 그래서 오늘은 우리가 정말 많이 헷갈리는

배열과 포인터의 관계

를 제대로, 진짜 쉽게! 설명드려볼게요. 코딩 입문자부터 중급자까지 꼭 알아야 할 핵심 포인트만 쏙쏙 뽑아봤으니 집중해서 따라와 주세요!

포인터 기초 개념 다시 잡기

포인터(Pointer)는 메모리의 주소를 저장하는 변수입니다. C언어는 하드웨어와 가까운 언어다 보니, 메모리를 직접 다루는 기능이 중요한데요. 여기서 포인터는 핵심 중의 핵심입니다. 예를 들어 int *p;라고 선언하면, 이 변수는 정수형 데이터가 저장된 메모리 주소를 가리킵니다.

그리고 & (주소 연산자)* (간접 참조 연산자)를 이해해야 포인터가 제대로 보이기 시작해요. 주소를 저장하고, 그 주소에 있는 값을 읽는 포인터의 이중 기능을 정확히 이해하는 게 중요하죠.

배열과 포인터, 뭐가 다를까?

많은 분들이 “배열은 포인터다”라는 말 때문에 혼란을 느끼시는데요, 그 말은 부분적으로만 맞습니다. 배열과 포인터는 비슷한 점도 있지만, 근본적으로 다른 성질을 가집니다. 아래 표를 보면 차이가 한 눈에 들어올 거예요.

항목 배열 포인터
메모리 크기 정해져 있음 동적으로 변할 수 있음
주소 변경 가능 여부 불가능 가능
sizeof 결과 전체 크기 포인터 크기만

배열과 포인터는 어떻게 연결될까?

배열 이름은 사실상 배열의 첫 번째 요소의 주소로 해석될 수 있어요. 예를 들어 int arr[5];라고 하면, arr&arr[0]과 동일하게 작동하는 거죠. 그래서 *(arr + i)arr[i]는 같은 결과를 만들어냅니다.

  • arr[i]는 실제로 *(arr + i)로 해석됨
  • 배열은 상수 포인터처럼 동작함 (주소값은 고정)
  • 배열 이름 자체로는 값을 변경할 수 없음
Q 배열과 포인터는 완전히 같은 건가요?

아니요. 배열은 고정된 메모리 블록이고, 포인터는 주소를 저장하는 변수입니다. 일부 상황에서 비슷하게 작동하지만 본질적으로는 다릅니다.

Q 왜 함수에서 배열을 포인터로 받는 건가요?

함수 인자 전달 시 배열 전체를 복사하는 건 비효율적이기 때문에, 배열의 주소만 넘겨서 포인터로 처리하는 방식이 기본입니다.

Q 포인터로 배열을 어떻게 순회하나요?

포인터 연산을 이용해 *(p + i) 또는 p[i] 형식으로 배열 요소에 접근할 수 있습니다. 두 방식은 동일한 결과를 만듭니다.

Q 배열의 크기를 함수 안에서 알 수 있나요?

직접적으로는 알 수 없습니다. 배열 크기를 함께 인자로 넘겨야 정확한 반복 처리나 계산이 가능합니다.

Q 배열 이름에 ++ 연산을 하면 안 되나요?

안 됩니다. 배열 이름은 상수 포인터처럼 작동해서 주소를 변경할 수 없기 때문에 arr++ 같은 연산은 불가능합니다.

Q 포인터로 선언된 변수는 배열처럼 사용할 수 있나요?

네. 메모리가 올바르게 할당되어 있다면 포인터 변수도 배열처럼 인덱스로 접근할 수 있습니다. 하지만 꼭 메모리 안전성을 확인해야 해요.

오늘은 C언어의 헷갈리는 개념 중 하나인 배열과 포인터의 관계에 대해 정말 깊고도 쉽게 풀어봤어요. 처음엔 다소 복잡하게 느껴질 수 있지만, 차근차근 이해하면 오히려 C언어가 얼마나 유연하고 강력한지 알게 됩니다. 여러분의 학습 여정에 이 글이 도움이 되었다면 정말 기쁠 것 같아요. 혹시 궁금한 점이나 더 알고 싶은 부분이 있다면 댓글이나 메시지로 언제든지 소통해 주세요! 😊

C언어, 포인터, 배열, 메모리, 함수인자, 주소연산자, sizeof, 배열초기화, 함수매개변수, C언어기초

댓글