nullvuild

Bloger @nullvuild

Created Date '2025/03/22 오전 06:55

Modified Date '2025/03/22 오전 07:50

#C언어 #배열 #포인터

C 언어를 처음 배울 때 가장 많이 막히는 부분이 있다면, 단연 포인터다. 그런데 포인터를 어렵게 느끼는 이유 중 하나는 배열과 메모리의 관계를 제대로 이해하지 못해서다. 이 글에서는 배열과 포인터의 관계를 중심으로, 왜 배열과 포인터가 중요한지를 먼저 살펴본다.


배열과 포인터는 관리하는 매커니즘이 다를 뿐, 메모리를 효율적으로 접근한다는 관점에서 보면 같은 개념이다. 즉, 포장지가 다르다고 생각하면 편하다.

배열이란 무엇인가?

Pasted Image

배열은 같은 자료형의 값을 연속된 메모리 공간에 저장하는 자료 구조다.

int arr[3] = {10, 20, 30};라고 선언하면, 정수형 데이터 5개가 서로 붙어 있는 메모리 공간에 저장된다.


// 예시
int arr[3] = {10, 20, 30};

이 코드에서 arr[0], arr[1], arr[2]는 각각 첫 번째, 두 번째, 세 번째 메모리 공간을 가리킨다.


중요한 건, 배열의 이름 자체가 그 배열의 첫 번째 요소의 메모리 주소를 가리키는 포인터 역할을 한다는 점이다.

즉, arr == &arr[0]는 항상 참이다.


포인터의 기초

Pasted Image

포인터는 특정 타입의 값을 저장한 메모리 주소를 담는 변수다.

예를 들어 int *p;는 정수형 데이터가 저장된 주소를 담을 수 있는 포인터다.



int x = 42;
int *p = &x;

이 경우, p는 x의 주소를 담고 있으며 *p는 그 주소에 저장된 실제 값, 즉 42를 의미한다.

이처럼 *는 포인터가 가리키는 주소에 접근하는 연산자고, &는 변수의 주소를 얻는 연산자다.


배열과 포인터는 어떤 관계일까?

배열과 포인터는 매우 밀접하게 연결되어 있다. 배열 이름은 포인터처럼 작동하며,

arr[i]는 사실 *(arr + i)라는 포인터 연산으로 해석된다. 즉, C에서는 배열도 결국 포인터로 접근하게 된다.


i 값의 기준은 포인터를 선언한 자료형에 따라 다르다. 당장은 이러한 연산이 가능하다는 정도로 이해하자.

이 개념을 이해하면, 이후에 등장할 문자열 처리, 함수 포인터, 동적 메모리 할당 등이 훨씬 자연스럽게 연결된다.

Nullvuild

Nullvuild

@nullvuild

프로필