포인터의 기본 개념
변수는 선언된 블록({}), 함수 내부로 사용이 제한 되어 있다. 이 말은 반복문, if문, main 함수 및 다른 함수에서 선언한 변수를 서로 다른 블록에서는 공유할 수가 없다. 그래서 사용 범위를 벗어난 경우에 데이터를 공유할 수 있는 새로운 방법인 포인터를 사용하는 것이다.
메모리의 주소
메모리는 우리가 데이터를 넣고 꺼내 쓰는 공간으로, 그 위치를 식별할 수 있어야 한다. 프로그램이 사용하는 메모리의 위치를 주소 값으로 식별할 수 있고, 그 주소 값은 바이트 단위로 구분 된다. 주소 값을 알고 싶으면 주소 연산자(&)를 사용해야 한다. 주소는 변수가 할당괸 메모리 공간의 시작 주소를 말한다. 시작 주소를 알면 그 위치부터 변수의 크기만큼 메모리를 사용할 수 있다.
포인터와 간접 참조 연산자(*)
포인터는 변수의 메모리 주소를 저장하는 변수이다. 포인터 변수를 선언할 때는 변수명 앞에 *만 붙여주면 된다. 포인터의 자료형은 저장할 주소의 변수 자료형과 같은 자료형을 사용해야 한다. 예로 int 변수의 주소를 저장하려면 int 자료형을 사용해 포인터 변수를 만들어야 한다. 간접 참조 연산자(*)는 포인터가 가리키는 변수를 사용한다는 것을 말한다. 4번째 코드를 보면 *를 사용해 b에 10을 할당하고 있다. 이 말은 a변수에 10을 할당한다는 말과 같은 소리이다.
int a;
int *b;
b = &a;
*b = 10;
주소와 포인터의 차이
주소는 변수에 할당된 메모리 저장 공간의 시작 주소 값 자체이고, 포인터는 그 주소 값을 저장하는 또 다른 메모리 공간이다.
포인터도 저장 공간이므로 크기가 있는데 그 크기는 저장할 주소의 크기에 따라 결정 된다. 주소와 포인터의 크기는 sizeof 연산자로 확인할 수 있다.