십육진법: 0~9, A~F로 수를 나타내는 방법이다.
십육진법을 표기할 때, 십진법과의 헷갈림을 방지하기 위해 0x를 앞에 붙여 표기한다.
📢 십육진법을 사용하는 예 : RGB 컬러코드, 컴퓨터의 메모리 주소

#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\n", n);
}
위와 같이 변수 n을 할당하면 우리의 컴퓨터 메모리 어딘가에는 50이라는 값을 가지고 있는 n이 4바이트를 차지하고 있을 것이다.

C에서는 이 변수의 메모리를 실제로 출력해볼 수 있다.
&연산자는 '이 변수의 메모리 주소를 가져와!'라는 연산자이다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%p\n", &n);
}
이 때 출력되는 메모리 주소는 0x12345678와 같은 십육진법으로 나타날 것이다.
*연산자는&연산자와 반대의 의미로, '가리키는 곳으로 가!'라는 의미이다.
따라서, 아래 코드는 먼저 &n으로 변수 n의 메모리 주소를 가져오고, *n의 메모리 주소가 되므로 해당 메모리 주소로 가서 int 값을 출력하게 될 것이다.
#include <stdio.h>
int main(void)
{
int n = 50;
printf("%i\n", *&n); // 50
}
포인터: 메모리 주소를 담고 있는 변수, 메모리의 어떤 장소를 가리키고 있는 변수하고 생각하면 된다.
C에서 포인터 변수를 선언하기 위해서는 * 연산자를 사용한다.
❗ 위에서 해당 주소로 가라는 의미의 * 연산자와는 다른 것이다. (헷갈리게 만들어놨네...)
#include <stdio.h>
int main(void)
{
int n = 50;
int *p = &n;
printf("%p\n", p); // 변수 n의 메모리 주소 출력
}
위 코드에서 int *p로 포인터 변수를 선언했고 &n을 할당했다.

위와 같이 변수 n과 포인터 변수 p를 만들었을 경우, 우리 컴퓨터의 메모리 어딘가의 모습은 이럴 것이다.
p도 변수이므로 메모리 어딘가에 자리를 차지하고 있을 것이고, n의 주소를 담고 있다.
포인터 변수 p는 4바이트의 int보다 2배 큰 8바이트를 차지한다.
string s = "HI!"; 로 문자열을 선언한다면 다음 이미지와 같이 메모리에 문자 하나하나를 저장할 것이다.

그렇게 하나하나 저장된 문자들은, 각각의 메모리 주소를 가진다.

결국 string s는 첫번째 문자의 주소를 가리키는 포인터일 뿐인 것이다.
