c언어/워딩(미정리)

포인터변수

도솔비 2019. 7. 8. 15:17

다시 한 번 메모리에 대해서 설명하자면, 컴퓨터의 메모리는 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에 대입되게 된다. 그냥 간단하게 사물함이 &를 만나서 번호로 갔다가, *를 만나면 다시 번호에서 사물함으로 돌아온다. 따라서 *&는 만나면 사라진다고 생각하면 간단하다. 꼭 이 공식을 이해하자.