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

우리가 변수 a를 선언하면 컴퓨터는 자동으로 a가 저장될 메모리 주소를 선택합니다. 이 경우에는 000C 라는 주소가 할당되어 변수 a의 값을 저장하는 공간으로 사용됩니다. 한편 변수 a에 할당된 값 ‘2’ 는 2진수로 변환되어 ‘00000010’ 으로 메모리의 000C 칸에 저장됩니다.
반면 우리가 사용하는 대부분의 자료형은 수 바이트 이상의 크기를 지닙니다. 여러 바이트를 사용하는 자료형은 메모리 주소에 어떻게 저장될까요?

여러 바이트의 자료형은 여러 칸을 묶어 하나의 칸처럼 사용하고, 가장 위 주소를 사용합니다. (지금까지는 메모리 저장 구조 표현을 위해 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>
메모리 주소를 저장하는 변수를 포인터 변수, 줄여서 포인터라고 부릅니다. 포인터를 선언할 때는 저장할 주소에 포함될 값의 자료형을 쓰고 변수명 앞에 * 기호를 사용합니다. * 기호를 애스터리스크라고 부릅니다.