주소 연산자 & 와 역참조 연산자 * — %p 주소 출력과 *(&score) | 기초 C언어 10.1.2

기초 C언어Chapter 10 포인터 › Section 01 포인터와 메모리 주소

10.1.2 주소 연산자와 역참조 연산자

변수에서 주소를 얻는 &와 주소에서 값을 꺼내는 *. 서로 반대 방향으로 움직이는 한 쌍의 연산자와 %p를 이용한 주소 출력.

교재 수록 위치
교재
『기초 C언어』 · 이은상 · 부크크 · 364쪽
단원
Chapter 10 포인터 › Section 01 포인터와 메모리 주소 › 주소 연산자와 역참조 연산자
쪽수
299p ~ 301p3쪽
세부 내용
주소 연산자 (&) · CODE 10.1 · 역참조 연산자 (*) · CODE 10.2
학습 목표
주소 연산자와 역참조 연산자의 역할을 구분하고, *(&score)가 score의 값과 같아지는 까닭을 설명함
영상 목차 · 원하는 부분부터 보기
  1. 0:00 · 강의 소개와 두 연산자
  2. 1:13 · 주소 연산자 &
  3. 2:59 · 값과 주소 출력 예제
  4. 4:57 · 역참조 연산자 *
  5. 7:50 · 두 연산자의 관계
  6. 8:39 · 핵심 정리

01scanf에서 붙였던 그 &교재 299p

  • 4.3.1의 scanf("%d", &age);에서 변수 앞에 붙인 &는 주소 연산자. scanf는 값을 저장할 자리를 알아야 하므로 변수의 값이 아닌 주소가 필요했음.
  • 앞 편에서 변수에는 이름과 함께 메모리 주소가 있음을 확인. 이번 편은 그 주소를 직접 알아내고, 주소로 값까지 꺼내는 두 연산자를 다룸.
  • C언어는 메모리 주소를 직접 다루기 위해 &와 *를 제공. 두 연산자는 서로 반대되는 역할이며 포인터 개념의 중요한 부분.

02주소 연산자 & — 변수의 집 주소 알아내기교재 299p

  • 주소 연산자(Address-of Operator) — 변수 이름 앞에 붙어 해당 변수가 저장된 메모리의 시작 주소 값을 구함. 변수에게 ‘너의 집 주소가 어디니?’라고 묻는 것과 같음.
  • 4바이트를 차지하는 int 변수라도 &가 돌려주는 것은 그 공간의 첫 칸 주소 하나.
  • 주소 값을 printf로 출력할 때는 변환 지정자 %p를 사용. p는 포인터(pointer)의 첫 글자.

03값과 주소를 차례로 출력교재 300p

  • CODE 10.1 — score를 100으로 초기화한 뒤, 값은 %d와 score로, 주소는 %p와 &score로 출력하는 구성.
  • 실행 결과는 값 100 한 줄과 0x로 시작하는 16진수 주소 한 줄. 상세 코드는 교재 CODE 10.1에서 확인.

주소 값은 컴퓨터마다 다름

교재에 실린 0x7ffc9f6b5a34는 하나의 예일 뿐. 같은 코드라도 컴퓨터마다, 실행할 때마다 다른 주소가 출력될 수 있으므로 결과의 주소가 교재와 달라도 오류가 아님.

04역참조 연산자 * — 주소로 값 꺼내기교재 300p

  • 역참조 연산자(Dereference Operator) — 메모리 주소 값을 받아 그 주소에 찾아가 저장된 실제 값을 꺼내옴. 집 주소로 그 집에 찾아가 안의 물건을 확인하는 일과 같음.
  • 다른 이름은 간접 참조 연산자(Indirection Operator). 주소를 거쳐 간접적으로 값에 접근한다는 뜻.
  • &score가 score의 주소라면, *(&score)는 그 주소에서 꺼낸 값이므로 결국 score의 값과 같음.

곱셈의 *와 역참조의 *

5.1.1의 곱셈 *는 두 값 사이에 놓이는 연산자. 역참조 *는 주소 앞에 하나만 붙는 연산자. 기호는 같아도 놓이는 자리로 구분함.

05주소를 거쳐 꺼낸 값도 100교재 301p

  • CODE 10.2 — CODE 10.1에 &score로 구한 주소를 다시 역참조해 출력하는 문장을 더한 구성.
  • 실행 결과는 세 줄. 값 100, 주소, 주소를 통해 알아낸 값 100. 첫 줄과 마지막 줄이 같은 값이라는 점이 핵심. 상세 코드는 교재 CODE 10.2.

06서로를 보완하는 한 쌍교재 301p

연산자방향예
& 주소 연산자변수 → 주소&score는 score의 시작 주소
* 역참조 연산자주소 → 값*(&score)는 100
  • &로 얻은 주소에 *를 붙이면 다시 원래 변수의 값. 갔던 길을 그대로 되돌아오는 관계.
  • 지금은 주소를 그때그때 구해 썼을 뿐 어디에도 담아 두지 않음. 주소를 저장하는 변수가 포인터 변수이며, 다음 10.2.1에서 그 선언과 사용을 다룰 예정.

이 절의 핵심 정리

  1. 주소 연산자 &는 변수 이름 앞에 붙어 그 변수가 저장된 메모리의 시작 주소를 구한다.
  2. scanf에서 변수 앞에 붙였던 &가 바로 주소 연산자였다.
  3. 메모리 주소 값을 printf로 출력할 때는 변환 지정자 %p를 사용하며, 출력되는 주소는 컴퓨터마다 다르다.
  4. 역참조 연산자 *는 주소를 받아 그 주소에 저장된 실제 값을 꺼내오며 간접 참조 연산자라고도 한다.
  5. &로 얻은 주소에 *를 붙인 *(&score)는 score의 값과 같다.
강의 자료10.1.2 주소 연산자와 역참조 연산자 1 / 11

번호를 누르면 해당 장으로 바로 이동합니다 · 방향키 ← → 로도 넘길 수 있습니다
다음 절 · 10.2.1 포인터 변수의 선언과 사용 교재 302p~305p — 주소 값 자체를 저장하는 포인터 변수 ↗

더 자세한 내용은 교재에서

이 글은 『기초 C언어』 299p~301p의 내용을 강의 영상에 맞춰 핵심만 간추린 요약입니다. 각 개념의 상세한 설명과 예제, 실습 코드, 임용시험 기출문제 풀이는 교재에서 다루고 있습니다.

댓글

이 블로그의 인기 게시물

2007년 국가직 9급 기계일반 기출문제 풀이

기계공작법 연습문제 130문 | 임용 기출 영상·교재 쪽수 바로가기