포인터 [ 크래프톤 정글 33일차 ]

jinsung·2025년 6월 14일

크래프톤 정글 9기

목록 보기
31/59

크래프톤 정글을 탐험하며, 이번주부터 python 대신에 C언어를 사용하게 되었어요.

이미 이전 주차에 movq와 leaq 같은 어셈블리어를 학습하면서 포인터의 개념을 이해했다고 생각했는데 막상 쓰니까 어렵네요.

그래서 오늘은 포인터에 대한 간단정리! 들어갑니다.

포인터

포인터는 메모리 주소를 저장하는 변수다.

이게 포인터의 전부인데요.

일반 변수는 값을 저장하지만, 포인터는 메모리 주소를 저장해요.

int a = 10;       // 변수 a에 10 저장
int* p = &a;      // 변수 a의 주소를 포인터 p에 저장

printf("%d",a) // 10
printf("%p",p) // 0x0000000583

위 코드는 변수 a 를 선언해서 10을 할당해요.
그리고 변수 p를 선언해서 a의 주소를 할당해줘요.

더 자세한 포인터를 알아보기 전에

"대체 주소값을 왜 저장하는 걸까요?"

포인터를 왜 쓸까?

왜 변수의 메모리 주소를 저장할까요?
이건 포인터가 왜 존재하는지 묻는 근본적인 질문이고, 사실 얼마나 C언어가 어셈블리어와 같은 메모리와 가까운 저수준 언어인지 보여줍니다.

1. 값을 직접 넘기지 않고, 간접적으로 접근하기 위해서

만약 함수에 엄청 큰 데이터를 넘긴다고 생각해보세요.

void modify(int a) {
    a = 100;   // 복사된 값만 바뀌고, 원본은 안 바뀜
}

이 함수는 a를 복사해서 받아오기 때문에 원본 값은 바뀌지않아요.

void modify(int* a) {
    *a = 100;  // 실제 주소에 있는 값을 바꿈 → 원본 수정
}

근데 포인터를 쓰면 직접 메모리에 접근해서 원본 데이터를 바꿀 수 있어요.
왜냐면 값이 아니라? 주소니까!

2. 배열과 문자열을 효율적으로 다루기 위해

배열을 함수에 넣을 때, 전체 데이터를 넣어서 복사하면 비효율적이겠죠?
그래서 C는 배열을 넘길 때, 자동으로 배열의 시작 주소 ( 포인터 ) 를 넘겨요.

void print(int* arr, int size) {
    for (int i = 0; i < size; i++) printf("%d ", arr[i]);
}

배열은 포인터처럼 취급돼서, 큰 데이터를 효율적으로 다룰 수 있어요.

3. 동적 메모리 할당을 위해 ( malloc,free )

C언어는 실행 중에 메모리를 직접 요청하고 해제할 수 있어요.
이 기능은 포인터가 없으면 불가능해요.

왜냐하면 malloc 은 메모리 주소를 반환하기 때문이예요.

int* p = malloc(sizeof(int) * 10);  // int 10개 크기의 메모리 할당

포인터는 어떻게 쓸까?

포인터는 이 세가지만 기억하세요

  1. 주소 (&) : 변수의 메모리 위치
  2. 역참조 (*) : 포인터가 가리키는 주소에 접근
  3. 선언 : 어떤 타입의 주소를 가리킬지 명시
int a = 5;
int* ptr = &a;

printf("%p\n", &a);   // a의 주소 출력
printf("%p\n", ptr);  // ptr에 저장된 주소 출력
printf("%d\n", *ptr); // ptr이 가리키는 주소의 값 출력 (즉, a의 값)

&a 하면 a의 주소값이구요.
int* 은 int 포인터로 int를 가리키는 포인터란 뜻이예요.

그리구 포인터에서 주소를 가져오는게아니라 값을 가져오고 싶을 수도 있잖아요?

그럴떄는 * 로 역참조를 해서 가져와요.

배열과 포인터

배열도 사실 포인터처럼 동작합니다.

int arr[3] = {10, 20, 30};
int* p = arr;

printf("%d\n", arr[1]);   // 20
printf("%d\n", *(p + 1)); // 20 → 같은 의미

arr[i]*(arr+i)는 완전히 같은 표현이예요.

이건 어셈블리어를 주의깊게 보셨다면 알 수 있어요.

배열도 주소값 내에서 선형으로 저장되니까요!

그래서 배열을 직접 복사하지 않고 주소만 넘기기 떄문에 성능상 유리한거예요.

마무리

포인터는 어렵지만, 제대로 익히면 맛있어요. ?

0개의 댓글