이번에는 Software환경에서 요긴하게 쓰이는 포인터에 대해 공부한 내용을 포스팅한다.

 

포인터(Pointer)는 "변수의 주소를 저장"하는 변수이다.

예를 들어서 int a = 10; 이라고 선언된 변수가 있을 때,

포인터를 활용해서 "10이 저장된 변수 a의 주소를 저장"할 수 있는 것이다.

음 .. 뭔가 알듯말듯 헷갈린 느낌이니 직접 살펴보자.

 

포인터 예시 Code

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) 포인터 선언과 사용의 차이

 

여기서 중요한 포인트가 있는데
*을 이용해서 포인터를 "선언"할 때와 이후에 *을 이용해 포인터를 "사용"할 때, 각각 접근하는 곳이 다르다는 점이다. 

위에서 사용한 예시에 몇가지 출력만 추가해서 살펴보자. 

포인터 예시 Code
포인터 예시 결과

어라라? 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의 값을 저장하고 있다는 의미이다. 

사실 쓰면서도 너무 헷갈리는 부분인데,, 이 부분이 포인터가 어렵고 곤란해지는 부분인 것 같다. 

 

위의 설명을 그림으로 대충 정리해보자면 다음과 같다.

*의 선언, 사용시의 view

공부를 하고 포스팅을 하니 확실히 공부했던 내용이 좀 더 정리되는 느낌이다.  

포인터가 아직은 아리까리하지만 정말 많은 부분에서 무궁무진하게 쓰인다고 하니 얼른 친숙해져야겠다 ㅋㅋ

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기