목차

VII-1. 메모리 주소

우리가 변수를 사용할때는 변수의 이름을 불러 사용합니다. 반면 컴퓨터는 변수를 메모리 공간에 저장하고 메모리 주소를 불러 사용합니다. 즉 컴퓨터에게 있어 변수의 이름이란 변수를 저장하는 메모리 주소를 말합니다.

메모리의 주소는 16진수로 표현합니다. 실제로는 메모리의 주소도 2진수로 이루어져있지만 사람이 보기 쉽도록 16진수로 표현하는 것이죠. 16진수라는 것은 0부터 9, 그리고 A,B,C,D,E,F 를 사용해 15까지 한 자릿수로 표시할 수 있는 진법 체계입니다. 각 주소에 할당된 메모리 칸은 1바이트 (8비트)의 크기를 가집니다. 1바이트 정수 자료형인 char형 변수를 통해 변수가 메모리에 어떻게 저장되는지 살펴봅시다.

image.png

우리가 변수 a를 선언하면 컴퓨터는 자동으로 a가 저장될 메모리 주소를 선택합니다. 이 경우에는 000C 라는 주소가 할당되어 변수 a의 값을 저장하는 공간으로 사용됩니다. 한편 변수 a에 할당된 값 ‘2’ 는 2진수로 변환되어 ‘00000010’ 으로 메모리의 000C 칸에 저장됩니다.

반면 우리가 사용하는 대부분의 자료형은 수 바이트 이상의 크기를 지닙니다. 여러 바이트를 사용하는 자료형은 메모리 주소에 어떻게 저장될까요?

image.png

여러 바이트의 자료형은 여러 칸을 묶어 하나의 칸처럼 사용하고, 가장 위 주소를 사용합니다. (지금까지는 메모리 저장 구조 표현을 위해 2진수를 사용해 표현했지만 이제부터는 메모리 안에 저장된 값도 값 그대로 표현하겠습니다.)

그렇다면 변수가 어떤 메모리 주소에 저장되어있는 확인하려면 어떻게 할까요?

#include <stdio.h>

int main()
{
    int a = -5;
    printf("%p\\n", &a);

    return 0;
}
000000df359ffdac

& 기호를 변수명 앞에 붙이면 됩니다. & 기호를 주소 연산자라고 합니다. 또한 메모리 주소를 출력할때는 ‘%p’ 연산자를 사용합니다.

<aside> 💡 참고 : 메모리 주소가 제가 실행했을때와 달라요!

매 번 할당되는 메모리 주소는 다르기 때문에 프로그램을 실행할때마다 출력되는 메모리 주소는 달라집니다. 메모리 주소의 길이도 시스템에 따라 다를 수 있는데, 32Bit 시스템을 사용하고 있다면 메모리의 주소가 4Byte(2진수로 32자리 = 16진수로 8자리), 64Bit 시스템을 사용하고 있다면 8Byte(16진수로 16자리)로 표시됩니다. 이 강의의 예시환경은 64Bit 환경이므로 8Byte주소가 출력되었습니다.

</aside>

VII-2. 포인터

메모리 주소를 저장하는 변수를 포인터 변수, 줄여서 포인터라고 부릅니다. 포인터를 선언할 때는 저장할 주소에 포함될 값의 자료형을 쓰고 변수명 앞에 * 기호를 사용합니다. * 기호를 애스터리스크라고 부릅니다.