이번에는 Software환경에서 요긴하게 쓰이는 포인터에 대해 공부한 내용을 포스팅한다.
포인터(Pointer)는 "변수의 주소를 저장"하는 변수이다.
예를 들어서 int a = 10; 이라고 선언된 변수가 있을 때,
포인터를 활용해서 "10이 저장된 변수 a의 주소를 저장"할 수 있는 것이다.
음 .. 뭔가 알듯말듯 헷갈린 느낌이니 직접 살펴보자.
int a = 10; 으로 변수 a에 값 10을 저장했고
int *ptr_a 로 ptr_a라는 포인터를 선언했다.
ptr_a=&a 로 ptr_a에 변수 a의 주소값(&a)을 저장해
printf를 통해 ptr_a에 저장된 값을 확인해보았다.
결과를 보니 요상한 9자리 숫자가 나왔는데 이것이 변수 a가 위치하고 있는 메모리의 주소이다.
참고로 변수 a의 값이 메모리 주소 어디에 올라갈지 모르기때문에 이 값은 매번 돌릴때마다 변한다.
1) 포인터 선언
포인터의 큰 개념정도는 확인했으니 이제 포인터의 선언에 대해서 알아보도록 하겠다.
위에서 보았던 예시에서 포인터 선언부를 보자.
위에서도 봤듯이 포인터를 선언할 때에는 (자료형) + * + (포인터 이름)으로 선언한다.
여기서 자료형은 포인터가 가르키는 변수의 형을 적어주어야 하는데..
위의 예시에서는 a라는 변수가 int형으로 선언이 되어있었기 때문에
a를 가르키는 포인터 ptr_a를 선언할 때에도 int형으로 선언해 준 것이다.
2) 포인터 선언과 사용의 차이
여기서 중요한 포인트가 있는데
*을 이용해서 포인터를 "선언"할 때와 이후에 *을 이용해 포인터를 "사용"할 때, 각각 접근하는 곳이 다르다는 점이다.
위에서 사용한 예시에 몇가지 출력만 추가해서 살펴보자.
어라라? ptr_a와 *ptr_a의 결과가 서로 다르다.
이것이 앞서 말했던 포인터를 선언할때와 사용할때의 차이점이다.
초기에 말했듯, 포인터는 "변수의 주소를 저장"하는 변수이다.
따라서 포인터 선언할 때, int *ptr_a = &a; 를 통해 ptr_a라는 포인터에는 "변수 a의 주소"가 들어간다.
그럼 선언할 때가 아닐 때, *ptr_a를 사용하면 어떻게 될까?
*ptr_a는 "ptr_a가 저장하고 있는 주소에 있는 변수의 값"을 저장한다.
즉, ① ptr_a가 저장하고 있는 주소 = 변수 a의 주소이고
② 변수 a의 주소에 있는 변수 = a 이므로
*ptr_a는 변수 a의 값을 저장하고 있다는 의미이다.
사실 쓰면서도 너무 헷갈리는 부분인데,, 이 부분이 포인터가 어렵고 곤란해지는 부분인 것 같다.
위의 설명을 그림으로 대충 정리해보자면 다음과 같다.
공부를 하고 포스팅을 하니 확실히 공부했던 내용이 좀 더 정리되는 느낌이다.
포인터가 아직은 아리까리하지만 정말 많은 부분에서 무궁무진하게 쓰인다고 하니 얼른 친숙해져야겠다 ㅋㅋ
최근댓글