포인터
프로그램을 실행하려면 CPU, RAM 등 하드웨어와 같은 컴퓨터 리소스 중 일부를 사용해야 한다. 이중 가장 중요한 것이 프로그램 실행 시 사용되는 임시 메모리 RAM(Random Access Memory)이다. 메모리의 기본 단위는 바이트이고 모든 변수는 몇 바이트의 모음이다. 이때 할당된 RAM 섹션은 프로그램에 필요한 바이트 수의 블록이다.
사진의 메모리 블록에서 모든 바이트에는 16진수로된 주소가 있다.
포인터를 사용해 메모리 바이트에 접근할 수 있다. 변수의 주소를 포함하는 포인터는 해당 변수를 가리킨다고 한다. 변수를 선언하면 연속적인 바이트 블록이 메모리에 예약된다. 변수에 대한 포인터는 이 바이트 중 첫 번째 바이트의 주소이다.
int *name;
int* name // 데이터유형 *포인터이름 혹은 데이터유형* 포인터이름 으로 사용한다.
메모리 블록의 첫 번째 바이트 주소를 저장하며 이를 보기 위해 다음을 이용한다.
<참조 연산자 &>
포인터 = &변수이름;
포인터 변수 ptr 선언을 통해 포인터에 변수 x의 메모리가 할당된다. 결과는 동일한 16진수의 주소를 얻을 수 있다.
<역참조 연산자 *>
변수의 메모리 주소가 할당된 포인터가 있으면.. 결국 변수를 사용하거나 조작할 수 있도록 된 데이터에 접근해야 한다. 포인터가 가리키는 메모리 주소에 포함된 데이터는 역참조 연산자(*)를 사용해 액세스 할 수 있다.
*포인터 이름;
포인터가 역참조되면 일반 변수처럼 포인터의 내용을 사용할 수 있다. 곱셈 연산자와 헷갈리지 않게 주의해야 한다.
역참조해 가리키는 주소에 저장된 데이터를 얻는 방법을 보여주는 예이다. 역참조된 포인터의 값이 변경되면 해당 변수의 값도 변경된다.
<포인터 산술>
포인터에 허용되는 유일한 산술 연산은 더하기와 빼기이다. 포인터에 더하거나 빼면 포인터가 새 주소를 가리키며, 메모리 바이트의 주소가 일반적으로 큰 숫자이기 때문에 곱셈은 허용되지 않는다. (곱셈을 통해 더 큰 숫자가 만들어져 사용 가능한 메모리 공간을 벗어난 주소를 나타낼 수 있다.)
포인터의 더하기 작업은 포인터에 정수를 추가할 때만 유효하다. 두 개 이상의 포인터를 함께 추가할 수 없다.
포인터를 *(데이터 형식의 크기(바이트)) 만큼 이동시킨다.