프로그램이 실행될 때 사용하는 임시 저장 공간이다. 메모리 구조와 포인터의 개념을 정확히 이해하면 배열, 함수 전달, 참조, 동적 할당 등에서 훨씬 유리하다.
| 영역 | 설명 | 예시 |
|---|---|---|
| 코드 영역 | 실행 코드 저장 | 함수 정의 등 |
| 데이터 영역 | 전역 변수, static 변수 저장 | static int cnt = 0; |
| 스택 영역 | 함수 호출 시 지역 변수, 매개변수 등 저장 | int a = 10; 함수 내부 변수 등 |
| 힙 영역 | 동적 할당 메모리 저장 (new, malloc) | int* p = new int; |
int a = 10;
cout << &a; // 변수 a의 주소 출력 ex) 0X00123
&a는 변수 a가 저장된 메모리 주소를 의미한다
컴퓨터는 변수에 이름을 붙이기보다는 주소를 기준으로 데이터를 처리한다
포인터는 어떤 변수의 주소를 저장하는 변수다.
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 방식으로도 많이 사용된다.
배열의 이름은 사실 배열의 첫 번째 요소의 주소를 의미한다.
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됨