모든 변수는 메모리에 값을 저장한다. const와 같은 고정값 변수 외의 모든 변수는 메모리 중에 RAM에 할당된다. 이러한 메모리의 공간을 구별하는 것이 메모리 주소값이다. 주소로 각각의 위치를 구별한다. 포인터 변수 모두는 메모리의 주소를 지정하는 값을 가진다. 데이터가 존재하는 주소값을 사용하여 액세스한다. 즉, 어떤 번지의 메모리에 값을 쓰거나 또는 읽어 오는 방식이다. 정적변수 역시 메모리에 배치되고 결국은 주소값을 가질 것이다. 그러나 차이점은 기계어 코드에 주소값을 고정하여 액세스된다. 그러나 포인터 변수는 주소값을 가지고 액세스하기 때문에 임의의 위치를 바꿀 수도 있게 된다. 전역변수의 정적변수는 기계어 코드에 주소값을 고정하는 방식이 일반적이다. 지역변수는 스택 또는 CPU의 레지스터를 써서 위치값을 설정한다. 포인터 변수는 메모리에 주소값을 저장하는 방식이기 때문에 이 주소값을 읽어 실제 데이터를 액세스한다. 메모리 액세스 모드 중에 직접주소방식으로 데이터를 액세스한다.

메모리의 주소는 CPU을 설계한 설계 기준에 따라 주소값의 길이와 방식이 결정된다. 일반적인 용도의 대부분의 CPU는 메모리를 지정하는 길이(비트수)는 동일하다. RAM이든 ROM/FLASH 이든 모든 주소는 같다. MCU(8051,...)은 오히려 많은 경우 메모리 영역을 나누어 다른 주소체계를 사용한다. 8051은 내부의 256바이트 내에 변수를 할당한다. 256바이트는 적기 때문에 많은 데이터를 처리하기 위해 변수는 잡을 수 없다. 많은 양의 데이터를 저장하기 위해 16비트의 저장 공간을 갖는 주소체계를 같이 사용한다. 그리고 양쪽의 액세스는 기계어 코드를 분리 해서 액세스한다. 이럴 경우는 주소값이 8비트 또는 16비트가 필요하다. C언어 컴파일러에서 이를 지정할 수 있는 방법을 제시한다.

포인터 변수의 유연성은 프로그램 작성의 유연성과 연관된다. C언어가 UNIX 계열의 OS 작성할 때 사용하였으므로 커널의 프로그램 소스를 보면 상당히 많은 부분 포인터 변수를 볼 수 있다. 유연성은 경우에 따라서 단점으로도 작용할 수 있다. 포인터 값에 따라 정의되지 않는 메모리 영역을 액세스할 수 있기 때문이다. 물론 정적 변수도 스스로의 배열 등의 공간 밖을 액세스할 수 있지만, 포인터를 사용하면 이것이 좀 더 복잡해진다.
8051은 변수를 잡기 위해 내부 메모리로 얼마를 사용하는가?
256바이트