메모리 주소를 직접 관리하는 것은 쉽지 않기 때문에, C에서는 포인터라는 개념을 통해 변수의 주소를 쉽게 저장하고 접근할 수 있다.
포인터에 대해 알아보자.
포인터 변수
* 연산자는 어떤 메모리 주소에 있는 값을 받아오게 해준다. 이 연산자를 이용해 포인터 역할을 하는 변수를 선언할 수 있다.
#include <stdio.h>
int main(void)
{
int n = 50;
int *p = &n;
printf("%p\n", p);
printf("%i\n", *p);
}
// 출력 예시
// 0x7ffe00b3adbc
// 50
int n = 50;- 정수형 변수n에 50 저장int *p = &n;- 포인터 변수p에 변수n의 주소 저장printf("%p\n", p);- 포인터p의 값(변수n의 주소) 출력printf("%i\n", *p);- 포인터p가 가리키는 값(변수n의 값) 출력
메모리에서의 포인터
실제 컴퓨터 메모리에서 변수 p는 다음과 같이 저장된다.

변수 n은 값 50을 저장하고, 포인터 p는 n의 주소를 저장한다.
추상화된 표현
실제로 p의 값(주소)을 정확히 알 필요는 없다. 추상적으로 "p가 n을 가리키고 있다"는 것만 이해하면 된다.

이렇게 화살표로 표현하면 포인터의 개념을 더 직관적으로 이해할 수 있다.
포인터 문법 정리
선언
int *p; // int를 가리키는 포인터
char *c; // char를 가리키는 포인터
초기화
int n = 50;
int *p = &n; // n의 주소를 p에 저장
사용
printf("%p", p); // 주소 출력
printf("%i", *p); // 값 출력
*p = 100; // 값 변경
연산자
*(선언 시): 포인터 변수 선언*(사용 시): 역참조 (주소의 값 가져오기)&: 주소 연산자 (변수의 주소 가져오기)
연습 문제
Q. 포인터의 크기는 메모리의 크기와 어떤 관계가 있을까?
포인터의 크기는 시스템의 아키텍처에 따라 다르지만, 메모리 주소를 저장하기 위해 필요한 비트 수에 따라 결정된다.
시스템별 포인터 크기:
| 아키텍처 | 주소 공간 | 포인터 크기 | 표현 가능한 메모리 |
|---|---|---|---|
| 32비트 | 2³² | 4바이트 | 약 4GB |
| 64비트 | 2⁶⁴ | 8바이트 | 약 16EB (엑사바이트) |
- 포인터 크기는 자료형과 무관
int *p1; // 8바이트 (64비트 시스템)char *p2; // 8바이트 (64비트 시스템)double *p3; // 8바이트 (64비트 시스템)- 모든 포인터는 메모리 주소를 저장하므로 크기가 같다.
- 시스템 아키텍처에 종속
- 32비트 시스템: 최대 4GB 메모리 주소 지정 가능
- 64비트 시스템: 이론상 16EB까지 주소 지정 가능
- 확인 방법
printf("포인터 크기: %lu바이트\n", sizeof(int*));
결론
포인터의 크기는 시스템이 다룰 수 있는 메모리 주소 공간의 크기를 결정한다.
더 큰 포인터는 더 많은 메모리를 주소 지정할 수 있다.
'TIL' 카테고리의 다른 글
| [CS50] 메모리 - 문자열 비교 (0) | 2025.11.07 |
|---|---|
| [CS50] 메모리 - 문자열과 메모리 (0) | 2025.11.07 |
| [CS50] 메모리 - 메모리 주소 (0) | 2025.11.07 |
| [CS50] 알고리즘 - 병합 정렬 (0) | 2025.11.06 |
| [CS50] 알고리즘 - 재귀 (0) | 2025.11.06 |
