포인터변수
다시 한 번 메모리에 대해서 설명하자면, 컴퓨터의 메모리는 32비트 플랫폼이면 그게 2^32byte의 메모리가 있는데 이것이 4GB고, 이 각각의 메모리에서는, 고유주소를 가지고 있다고 했다. 강의를 들어가면서 누누이 설명한 내용이니 영상의 마지막언급이므로 확실히 알아두자.
여기서 위치정보를 가지고 그 위치에 있는 정보를 가진 무언가를 접근하는 것이 ‘포인터’다. 사실 포인터와 배열은 거의 같다(==). 비유하자면, 그릇에 정보가 있는 것과, 그냥 정보만 있는 것의 차이다.
포인터
포인터는 지도, 단축아이콘, 별명, 또 다른 방법 등으로 비유해서 이해할 수 있다. 이 비유가 설명하는 점은, 포인터는 어떤 정보를 담는 그릇을 (위치정보, 고유주소로) 가리켜서 결국 가리키는 정보를 추가로 연결해주는 역할이다.
“int nData = 10;”의 식이 있다면, 여기서 ‘int'는 자료형, 'nData'는 변수의 이름으로 'int nData'는 변수의 선언이고, '= 10;'은 변수의 정의로, 여기서 ’10‘은 초깃값이 된다. 그리고 이 함수로 변수의 메모리 확보를 하는 목적이라는 것은 지난 강의에 충분히 설명했다. 그러면 이제 포인터의 선언식으로 넘어가보자.
“int *pnData = &nData;“의 식은 어떨까? 위 배운 식과 대조하면서 알아보자. 'int *'는 int에 대한 *(포인터)로 *는 묻지도 따지지도 않고 포인터라는 것을 뜻한다. (‘~ *‘ == ’~에 대한 포인터‘) 그리고 뒤에 붙는 ’pnData’는 이름이다. ‘&nData;’는 주소로, 위치정보다. 총합하면, 포인터 변수선언은 포인터 변수의 그릇(자료형)이 있다면, 여기에 담는 정보가 주소(위치정보)가 되는 것이다.
변수, 포인터 개념정리
변수선언은 어떻게 보면 그릇확보라고 볼 수 있다. 그릇 == 변수, 자료형 == 그릇의 종류,(그릇에 담는)정보 == 상수라고 일반적인 경우에서 같다고 할 수 있다.
그리고 지난강의 &(주소연산자)와 *(간접지정연산자)를 배웠는데, 이 둘은 곱하기와 나누기 관계이다. ‘사물함‘ == 변수 사물함의 ‘번호‘ == 주소로 가정할 경우, ’사물함‘->’번호‘는 &이고 ’번호‘->’사물함‘은 *이다.
그래서 ‘pnData = 20‘일 때, pnData가 포인터여도 단순대입으로 주소를 가진 정보에 20이 저장되는 것이고, ‘*pnData = 20;‘일 때, pnData안에 들어있는 주소(== ’번호‘)가 *를 만났으니까 *는 ’번호‘->’사물함‘으로, pnData안에 들어있는 변수(== ’사물함‘)가 20에 대입되게 된다. 그냥 간단하게 사물함이 &를 만나서 번호로 갔다가, *를 만나면 다시 번호에서 사물함으로 돌아온다. 따라서 *와 &는 만나면 사라진다고 생각하면 간단하다. 꼭 이 공식을 이해하자.