CS | 메모리와 포인터(C++)

성수당·2025년 7월 15일

나혼자 CS

목록 보기
9/18
post-thumbnail

🥔 메모리란?

프로그램이 실행될 때 사용하는 임시 저장 공간이다. 메모리 구조와 포인터의 개념을 정확히 이해하면 배열, 함수 전달, 참조, 동적 할당 등에서 훨씬 유리하다.

영역설명예시
코드 영역실행 코드 저장함수 정의 등
데이터 영역전역 변수, static 변수 저장static int cnt = 0;
스택 영역함수 호출 시 지역 변수, 매개변수 등 저장int a = 10; 함수 내부 변수 등
힙 영역동적 할당 메모리 저장 (new, malloc)int* p = new int;

🥔 변수의 주소: & 주소 연산자

int a = 10;
cout << &a;  // 변수 a의 주소 출력 ex) 0X00123
  • &a는 변수 a가 저장된 메모리 주소를 의미한다

  • 컴퓨터는 변수에 이름을 붙이기보다는 주소를 기준으로 데이터를 처리한다

🥔 포인터(pointer)란?

포인터는 어떤 변수의 주소를 저장하는 변수다.

int a = 10;
int* p = &a;   // p는 a의 주소를 저장하는 포인터
  • int* p: 정수형 주소를 저장하는 포인터

  • &a: 변수 a의 주소

  • 포인터 자체도 하나의 변수로 메모리에 존재

🥔 역참조 연산자 *

int a = 10;
int* p = &a;
cout << *p;   // 10 출력 (a의 값)

| *p 는 포인터가 가리키는 주소에 저장된 값을 가져온다.
| 다시 말하면, p는 주소, *p는 그 주소에 있는 값이다.

🥔 포인터의 예시

int a = 5;
int* p = &a;

*p = 100;
cout << a;  // 100 (a의 값이 바뀜)

| 포인터로 값을 바꾸면 원본 변수에도 영향을 준다.
| 함수 인자 전달 시 Call by reference 방식으로도 많이 사용된다.

🥔 배열과 포인터의 관계 (Decay 현상)

배열의 이름은 사실 배열의 첫 번째 요소의 주소를 의미한다.

int arr[3] = {10, 20, 30};
cout << arr;     // arr == &arr[0]
cout << *arr;    // *arr == arr[0]

| Array to Pointer Decay:
배열이 함수로 전달되거나 연산에 사용될 때 자동으로 포인터로 변환되는 현상

void print(int* ptr) {
    cout << ptr[0];  // 배열처럼 사용 가능
}

int arr[] = {1, 2, 3};
print(arr);  // arr → int* 로 decay됨
profile
말하는 감자🥔

0개의 댓글