본문 바로가기

값이 아니라 주소를 가리키다 | 정보처리의 흐름 FLOW 04 | K-BOOKS

FLOW 04 · INFORMATION PROCESSING
DIRECTION 04 · 정보를 찾아가는 방향 · C · Java · Python · OOP

값이 아니라 주소를 가리키다

C · Java · Python · OOP

QUESTION · 질문에서 시작합니다

변수는 메모리 어딘가에 저장된다. 그렇다면 그 위치를 직접 가리킬 수도 있을까?

int a = 10;

a라는 변수에는 10이 들어 있다. 하지만 컴퓨터 입장에서는 메모리의 어떤 위치에 10이 저장되어 있는 것이다.

“그 위치의 주소를 다른 변수에 저장하면?”

포인터를 이해할 때 값과 주소를 한 줄에 섞어 적으면 금방 헷갈린다. 변수 a에는 값 10이 있고, 포인터 p에는 a가 저장된 위치의 주소가 있다는 식으로 두 종류의 정보를 나누어 생각해야 한다.

&는 변수의 주소를 얻고, *는 그 주소가 가리키는 곳의 값을 다룬다. 시험에서는 기호를 외우는 것보다 ‘지금 이 변수에 들어 있는 것이 값인가, 주소인가’를 계속 구분하는 것이 더 중요하다.

주소를 저장하는 변수

int a = 10; int *p = &a

&a는 a가 저장된 메모리 주소를 뜻하고, p는 그 주소를 저장한다.

*p = 20;

p가 가리키는 위치에 20을 저장한다. 결국 a의 값도 20으로 바뀐다.

기술 이름 다른 변수나 데이터가 저장된 메모리 주소를 저장하는 변수를 포인터(Pointer)라고 한다.
ILLUST A | ILL-10 | a의 메모리 위치와 p가 a를 가리키는 구조 | 포인터 핵심 그림
ADDRESS MAP포인터는 값이 아니라 다른 변수의 주소를 저장한다
0x1000x = 10
0x1004y = 20
0x1008p = 0x1000
p→주소를 따라감
0x1000*p → 10
0x100420
0x10080x1000
포인터 문제는 ‘변수의 값’과 ‘변수가 저장된 주소’를 분리해서 보면 훨씬 단순해진다.

포인터가 어려운 이유

숫자 10을 보는 것과 10이 저장된 주소를 보는 것은 전혀 다르다.

a → 값 10
&a → a의 주소
p → a의 주소
*p → 그 주소에 저장된 값

시험에서 포인터 문제가 나오면 머릿속으로만 따라가지 말고 변수와 주소의 연결을 그림으로 적는 것이 안전하다.

포인터는 메모리를 직접 다룰 수 있게 해 주는 만큼 잘못된 주소를 사용하면 프로그램 전체에 큰 영향을 줄 수 있다. 따라서 ‘주소가 유효한가’, ‘가리키는 대상의 수명이 끝나지 않았는가’를 함께 생각해야 한다.

배열 이름과 주소의 관계

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

배열의 원소는 메모리에 연속적으로 놓인다.

그래서 배열의 시작 위치와 첫 번째 원소의 주소는 밀접하게 연결된다.

arr[0] *(arr + 0) arr[1] *(arr + 1)

이런 표현을 이해하면 배열과 포인터 문제가 하나의 구조로 보이기 시작한다.

다음 비밀 이름, 나이, 전화번호처럼 서로 다른 종류의 데이터를 하나로 묶고 싶다면?
더 찾아보고 싶다면846면 학습 아카이브에서 검색하세요.
K-BOOKS Q&A이 내용이 헷갈리나요?

공부하던 페이지를 자동으로 연결해 질문할 수 있습니다.

RELATED STUDY MATERIALS

이 개념과 이어서 볼 정보처리 자료

학습자료실 65개 →

CONTINUE · INFORMATION PROCESSING ENGINEER 2027C에서 시험 학습으로 이어가기
이야기형 개념 설명은 그대로 두고, 필요한 시험 요약·문제·실습으로 연결합니다.