CS 기초/메모리

[CS50] 메모리 주소

담크 2021. 8. 18. 23:22

오늘부터는 메모리와 관련해서 공부해보도록 하겠습니다. 오늘은 예전에 문자열과 배열에서 잠깐 다룬 적 있었는데 

참조하실분들은 참고해주세요~

https://darmk.tistory.com/entry/CS50-%EB%AC%B8%EC%9E%90%EC%97%B4%EA%B3%BC-%EB%B0%B0%EC%97%B4?category=966397 

 

[CS50] 문자열과 배열

C뿐 아니라 많은 프로그래밍 언어들은 문자열을 저장하기 위해 string 자료형을 사용했습니다. 문자열이라는 단어는 문자가 나열되어있다. 즉 배열되어있다.라는 의미로 추측해볼 수 있는데요.

darmk.tistory.com

실제로 코딩할때 작성하는 변수들은 컴퓨터 메모리에 어떤 방식으로 저장되는지 그리고 그 저장된 변수의 메모리 주소를 나타내는 방법과 그 주소를 알아내는 방법, 주소에 찾아가는 방법에 대해 공부해보도록 하겠습니다.

 

컴퓨터과학에서 16진수는 10진수보다 2진수를 간단하게 나타낼 수 있기때문에 숫자를 16진수로 표현하는 경우가 많이 있습니다. 왜냐하면 컴퓨터는 0과 1만을 이해할 수 있기 때문입니다.

 

그럼 16진수는 어떻게 표현할 수 있을까요??

먼저 255라는 10진수를 먼저 2진수로 바꿔보겠습니다. 2진수로 표현하면 11111111(2)이 될 겁니다. 이렇게 모든 데이터를 표현하기에는 너무 길어지기 때문에 이를 16진수로 바꿔보겠습니다. 16진수는 9까지는 그대로 표기하고 10부터 15까지 a, b,..., f까지를 대입해서 사용합니다. 여기서 2^4이 16이기 때문에 4bits씩 두 덩이로 나눠보면 1111과 1111로 나눌 수 있는데 1111은 15이므로 16진수로 표현하게 되면 f가 됩니다. 그러면 255는 16진수로 ff가 되는데 다른 수와 헷갈리지 않기 위해 변환 후 0x를 붙여 뒤에 오는 문자들이 16진수임을 알려줍니다. 따라서 255는 0xff가 됩니다.

아래 그림을 참고하시면 더 이해하기 편할 겁니다.

문자를 표현할 때 역시 16진수로 표현하는 게 훨씬 간단합니다. 'A'를 예를 들면 'A'는 ASCII 코드로 65에 해당됩니다. 이를 2진수로 표현하려면 01000001로 너무 길어지게 되는데 16진수로 변환하면 0x41로 훨씬 간단하게 표현 가능한 것을 볼 수 있습니다.

또한 컴퓨터는 바이트(byte) 단위로 정보를 표현하기 때문에 2진수보다 16진수가 정보를 표현하기 유용하다는 것을 알 수 있습니다.

 

 

메모리주소

다음과 같은 코드가 있다고 가정해봅시다.

#include<stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", n);
}

여기서 n은 int 타입이므로 아래 그림처럼 컴퓨터의 메모리 어딘가에 4byte만큼의 자리를 차지하며 저장되어 있을 겁니다.

여기서 메모리 상의 주소를 알아보기 위해서는 '&'연산자를 사용하면 됩니다.(여기서 p는 포인터입니다.)

#include<stdio.h>

int main(void)
{
    int n = 50;
    printf("%p\n", &n);
}

주소가 16진수로 되어있죠? ㅎㅎ n = 50이라는 값은 위의 주소에 저장되어있다는 것을 확인할 수 있습니다.

여기서 '&'와 반대로 '*'를 사용할 수 있는데 '*'은 그 주소로 가줘(즉 실제값을 알려줘)라는 의미를 가지고 있습니다.

#include<stdio.h>

int main(void)
{
    int n = 50;
    printf("%i\n", *&n);
}

그래서 코드를 이렇게 작성한다면 코드는 'n의 주소를 알려주고 그 주소로 가서 값을 알려줘'라는 의미가 되기 때문에 

이렇게 50의 값이 정상 출력됩니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 메모리' 카테고리의 다른 글

[CS50] 메모리 교환, 스택, 힙  (0) 2021.08.24
[CS50] 문자열 복사  (0) 2021.08.22
[CS50] 문자열 비교  (0) 2021.08.21
[CS50] 문자열  (0) 2021.08.20
[CS50] 포인터  (0) 2021.08.19