반응형
컴퓨터 메모리와 변수 간 관계에 대한 개념적 이해
메모리의 정의와 구조
컴퓨터의 메모리는 프로그램 실행 시 데이터를 저장하고 관리하는 연속적인 바이트 공간입니다. 이는 크게 코드 영역, 데이터 영역, 힙(Heap), 스택(Stack) 영역으로 나뉘며, 각 영역은 서로 다른 용도와 생명 주기를 가집니다.
- 코드 영역: 실행 코드가 저장되는 읽기 전용 메모리
- 데이터 영역: 전역 변수, 정적(static) 변수 저장 공간
- 힙 영역: 동적 할당 메모리 저장소 (malloc, new 사용)
- 스택 영역: 함수 호출 시 지역 변수와 매개변수 저장소
변수와 메모리의 관계
- 변수는 데이터에 이름을 붙인 추상적 개념이고, 실제 값은 메모리 상 특정 주소에 저장됩니다.
- 변수는 할당된 메모리 공간을 참조하며, 그 주소는 & 연산자로 확인할 수 있습니다.
int x = 10;
printf("%p", &x); // 변수 x의 메모리 주소 출력
포인터(Pointer)의 개념과 변수 주소 저장 방식
포인터의 정의
포인터는 메모리 주소를 저장하는 변수입니다. 즉, 포인터 자체는 메모리에 저장된 데이터의 위치(주소)를 가리키는 값을 보관합니다.
int x = 42;
int *p = &x; // x의 주소를 p에 저장
포인터의 메모리 구조
- 포인터 변수도 메모리에 저장됩니다.
- 포인터가 가리키는 주소와 포인터 자체의 주소는 다릅니다.
항목 | 설명 |
p | 포인터 변수 (주소를 저장함) |
&p | 포인터 변수 자체의 주소 |
*p | 포인터가 가리키는 대상(값) |
주소 연산자(&)와 역참조 연산자(*)의 원리 및 차이점
주소 연산자 (&)
- 변수 앞에 붙여서 해당 변수의 메모리 주소를 반환합니다.
- 결과는 포인터 값이며, 이 주소는 다른 포인터 변수에 저장 가능합니다.
int x = 5;
int *p = &x; // x의 주소를 p에 저장
역참조 연산자 (*)
- 포인터 변수 앞에 붙여서, 그 포인터가 가리키는 실제 값을 참조합니다.
- 즉, 주소를 통해 값을 접근합니다.
*p = 10; // x의 값이 10으로 변경됨
중첩된 연산 이해 포인트
- &x는 x의 주소 → 포인터 저장
- *p는 p가 가리키는 주소에 있는 값 → 역참조
- *&x = x, &*p = p (연산 상쇄 관계)
배열(Array)과 포인터(Pointer)의 관계 및 Array to Pointer Decay 개념
배열과 포인터의 구조적 차이
- 배열은 고정 크기의 연속된 메모리 블록입니다.
- 포인터는 주소를 저장하는 변수이며, 배열의 시작 주소를 담을 수 있습니다.
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // arr은 배열 이름이지만 포인터처럼 해석됨
Array to Pointer Decay의 정의
- 배열의 이름은 배열 전체를 의미하지만, 대부분의 표현식에서 배열 이름은 배열의 첫 번째 요소의 포인터로 '자동 변환(decay)'됩니다.
- 즉, arr은 &arr[0]으로 변환되어 포인터처럼 행동합니다.
arr == &arr[0]; // true
*p == arr[0]; // true
Decay가 발생하지 않는 예외
- sizeof(arr): 전체 배열 크기 반환
- &arr: 배열 전체의 주소를 반환 (타입: int (*)[5])
- 배열을 함수 인자로 전달할 때 → decay 발생
면접 대비 포인트
- int arr[5]; vs int *p;의 차이점 정확히 설명
- 함수 인자로 배열을 전달하면 decay 발생하여 포인터로 받는다는 것 인지
- sizeof(arr)와 sizeof(p)의 값 차이 설명 가능해야 함
면접 대비: 포인터와 메모리 관련 주요 질문 정리
질문 | 설명 요 |
포인터란 무엇인가요? | 주소를 저장하는 변수이며, 역참조를 통해 값 접근 가능 |
배열과 포인터는 같은가요? | 배열은 메모리 블록, 포인터는 주소 저장 변수, decay로 연결됨 |
*p와 p의 차이를 설명해보세요 | *p는 역참조로 값 접근, p는 주소 그 자체 |
왜 포인터가 필요하나요? | 동적 메모리 관리, 함수 간 데이터 전달, 자료구조 구현 등 |
배열 이름이 왜 포인터처럼 동작하나요? | array-to-pointer decay 때문에, 대부분 표현식에서 첫 요소 주소로 변환 |
요약
- 메모리는 프로그램 실행 중 데이터를 저장하고 참조할 수 있는 공간으로, 변수는 해당 공간의 별칭입니다.
- 포인터는 변수의 주소를 저장하며, 역참조 연산을 통해 실제 값을 간접적으로 접근합니다.
- &는 주소 연산자, *는 역참조 연산자이며, 둘은 포인터 연산의 핵심 구성요소입니다.
- 배열은 연속된 메모리 덩어리이고, 대부분의 표현식에서 포인터로 자동 변환되는 현상을 Array to Pointer Decay라고 합니다.
- 면접에서는 포인터의 메모리 구조, 배열-포인터 관계, decay 동작 원리에 대한 깊이 있는 이해와 구체적인 연산 설명 능력이 평가됩니다.
반응형
'알고리즘 자료구조 공부일지' 카테고리의 다른 글
자료구조 마스터: 스택과 큐의 구조, 차이, 응용 (0) | 2025.05.29 |
---|---|
연결 리스트와 랜덤 접근 vs 순차 접근 (1) | 2025.05.25 |
정적 배열(Array) vs 동적 배열(Vector) (0) | 2025.05.20 |
공간복잡도란? 시간복잡도와의 차이 (0) | 2025.05.17 |
시간복잡도란? (feat.빅오표기법) (0) | 2025.05.17 |