상세 컨텐츠

본문 제목

부스트코딩 뉴비챌린지 스터디 5주차 : 메모리, 포인터

IT/스터디

by J KIMS 2020. 9. 6. 23:12

본문

반응형

1) 메모리 주소

 

16진법 (Hexadecimal)

 

컴퓨터과학에서는 16진법을 사용해서 적는 경우가 많다. 

 

0 1 2 3 4 5 6 7 8 9 A B C D E F

 

16진수는 위의 숫자와 문자들을 사용해서 나타낸다.

0부터 9까지는 10진법으로 나타냈을 때와 동일하지만 10이상부터 표기가 달라진다.

 

10진법

8

9

10

11

12

13

14

15

16

16진법

0 8

0 9

0 A

0 B

0 C

0 D

0 E

0 F

1 0

10진법

17

18

19

20

21

22

23

24

25

16진법

1 1

1 2

1 3

1 4

1 5

1 6

1 7

1 8

1 9

 

 

RGB 값을 최대로 한 ffffff의 색은 흰색이다

 

RGB 표기에도 16진법이 쓰인다. 각 RGB가 나타낼 수 있는 값의 범위인 0~255를 16진법으로 표기하면 0~FF이다.

 

10진수와 헷갈리지 않게 16진수 앞에는 0x를 붙여서 표현한다.

특별한 의미는 없고 단지 구분하기 위함이다. ex) 0x1, 0xA

 

컴퓨터는 10진법을 이해하지 못하기 때문에 2진수로 표현해야 하는데, 2진수는 그 길이가 너무 길어 16진수로 표현하면 훨씬 간단하다. 컴퓨터의 바이트 단위는 8비트로 나타내는데 이를 16진수를 바꾸면 두 자릿수가 된다. 

 

 

A

10진수

65

2진수

0100 0001

16진수

0x41

16진수에서는 한 자리당 16까지 나타낼 수 있다. 2진수의 4자리(2^4 = 16)가 16진수의 한 자리에 대응되는 셈이다. 그래서 위에서도 2진수로 0100 0001이라고 적은 것을 4자리씩 끊어서, 0100=4, 0001=1 로 바꿔 표기한 것이다.

 

 

📣 주소 연산자 (address operator)

 

변수명 앞에 주소 연산자 &를 붙이면 변수가 저장된 메모리의 위치를 알 수 있다.

 

 

위에 결과에 따르면 변수 n이 저장된 곳의 주소는 0x7fff5a5690c8이다. 이 결과 값은 컴퓨터에 따라 달라진다.

 

이때 변수의 주소를 출력하기 위해 형식 지정자는 %p로 지정했다. %p는 주소값을 16진수로 출력해준다.

 

흔히들 이런 이미지로 표현을 많이 한다. 변수 n에 담겨있는 값은 10이고 메모리 상 위치가 0x7fff5a5690c8인 것이다. n에 무슨 값을 넣든 주소값은 바뀌지 않는다.

 

C언어 처음 배울때 주소값을 이해하는 게 제일 어려웠는데 한 번 깨우치고 나면 그 뒤론 쉽다.

 

 

📣 포인터 연산자 *

 

변수의 주소에 *를 붙이면 그 주소 안에 있는 값에 접근하는 게 가능해진다.

 

 

해당 주소 안의 값을 가리킨다고해서 포인터(pointer) 연산자라고 부른다.

 

그냥 n을 출력해도 10이 나오고, *&n을 출력해도 10이 나오는데 번거롭게 후자를 쓰는 이유는 뭘까?

 

지금 처럼 메인 함수안에서 단순히 n의 값을 출력하는 경우엔 printf("%d", n); 이라고 해도 상관없다.

하지만 나중에 메인 함수 밖에서 n의 값에 접근한다던지, 어떤 제한이 생길때 위의 포인터가 필요하게 된다.

 

 

2) 포인터

 

int* p이든 int *p로 적든 *를 어디에 붙이는지는 상관없다.

변수를 선언할때 앞에 *를 붙여주면 그 변수는 포인터 변수가 된다.

 

포인터 변수가 일반 변수와 다른 점은 주소를 저장할 수 있다는 점이다.

 

 

위에서 &n이 n의 메모리 주소값을 나타낸다는 걸 배웠다. 이 값을 포인터 변수 p에 저장한 게 위 코드이다.

 

출력값을 보면 알겠지만 p는 n의 주솟값을 담고 있기 때문에 &n의 값을 출력하는 것과 결과가 동일하다.

 

또, p는 n의 주소값을 담고 있기 때문에 포인터 연산자로 n의 값에 접근하는 게 가능하다.

그래서 *p를 출력하면 n에 저장된 값인 5가 출력된다.

 

처음에는 이게 굉장히 헷갈리는데 중요한건 메모리 주소값을 알면 그 안의 값에 접근 가능하다는 사실이다.

 

사실 포인터 변수의 크기는 8byte로 int형 보다 더 크지만 대략적인 비유를 위해 똑같은 크기의 네모로 나타냈다.

 

포인터 변수p 안에는 변수 n의 주솟값이 담겨 있고 포인터 연산자를 통해 n의 값에 접근 가능한 것을 그림으로 나타내보았다.

 

포인터 변수p도 메모리 어딘가에 저장되어 있기 때문에 당연히 주소값이 존재할 것이지만 일단 여기선 나타내지 않았다. 혹시 궁금한 사람은 &p도 출력해보기를.

 

cs50의 강의를 들으며 새롭게 알게 된 사실은 포인터가 추상화를 위한 도구란 점이다. 우리는 n의 주소를 몰라도 포인터를 통해 n을 가리키게 하고 그 값 안에 접근할 수 있다. 이는 n의 주소를 직접 구해서 접근 하는 것보다 더 편리하다. 

 

 

 

반응형

관련글 더보기

댓글 영역