본문 바로가기
C_프로그래밍

[C 프로그래밍] 41장. 구조체 포인터

by 팔공산호랑이 2020. 4. 7.

------------------------------------------------------------------

------------------------------------------------------------------

 

------------------------------------------------------------------

 

구조체 포인터도

우리가 앞에서 배운 일반적인 포인터 변수와 같습니다.

*() 연산자를 이용해

참조하고

주소가 가리키는 곳의 메모리를 참조합니다.

------------------------------------------------------------------

 

특별히 구조체 포인터에선

화살표  연산자 라는 것을 쓸 수 있는데

기능은 앞에서 본 참조 연산자의 기능과 동일하지만

훨씬 쉽고 편하게 쓸 수 있어서

자료구조에서 정말 많이 쓰이게 되는 연산자 입니다.

------------------------------------------------------------------

우선 첫번째 예제를 살펴보면

일단 처음에

person 구조체를 정의하고 있습니다.

------------------------------------------------------------------

11번째 줄에서 person 구조체 변수 p를 선언하고

12번째 줄에서 person 구조체 포인터 변수 ptr을 선언했습니다.

------------------------------------------------------------------

14번째, 15번째 줄에서

구조체변수 p에 값을 대입하고 있습니다.

------------------------------------------------------------------

17번째 줄에서

구조체 포인터 변수 ptrp의 주소를 대입하고 있습니다.

이렇게 되면

구조체 포인터 변수 ptr이 구조체 변수 p를 가리키게 됩니다.

그림으로 자세히 보겠습니다.

------------------------------------------------------------------

이렇게

구조체 포인터 변수 ptr

구조체 변수 p를 가리키고 있습니다.

------------------------------------------------------------------

그 다음

19번재, 20번째 줄에서는

화살표 연산자를 사용하여

ptr이 가리키는 곳의 ageheight 를 출력하고 있습니다.

------------------------------------------------------------------

실행결과는 다음과 같습니다.

------------------------------------------------------------------

다음 예제를 살펴보면

자주 보았던 point 구조체의 정의입니다.

------------------------------------------------------------------

우선, 첫번째 코드를 살펴보겠습니다.

------------------------------------------------------------------

11번째 12번째 줄에서

구조체 변수를 선언하고 값을 초기화 하고 있습니다.

------------------------------------------------------------------

14번째 줄에서

구조체 포인터 변수 pptr을 선언하고

구조체 변수 pos1의 주소를 대입하고 있습니다.

,

구조체 포인터 변수에

구조체 변수의 주소를 대입하게 되면

구조체 포인터 변수가, 구조체 변수를 가리키는 모양이 됩니다.

이것을 그림으로 자세히 살펴보겠습니다.

------------------------------------------------------------------

구조체 포인터 변수 pptr

구조체 변수 pos1의 주소를 대입하여

pptrpos1을 가리키는 모양입니다.

------------------------------------------------------------------

그 다음 15번째, 16번째 줄에서

참조연산자 *을 이용해서

pptr이 가리키는 곳의 xpos4를 더하고

pptr이 가리키는 곳의 ypos5를 더하여

구조체 변수의 값을 변경하고 있습니다.

그림으로 자세히 살펴보면

------------------------------------------------------------------

구조체 포인터 변수 pptr이 가리키는 곳의

xpos4를 더하고

ypos5를 더하여

값을 변경했습니다.

------------------------------------------------------------------

좀 더 자세하게 풀어보면

pptr이 가리키는 곳의 xpos의 값에 4를 더해서

pptr이 가리키는 곳의 xpos의 변수 공간에 대입하고 있습니다.

pptr이 가리키는 곳의 ypos의 값에 5를 더해서

pptr이 가리키는 곳의 ypos의 변수 공간에 대입하고 있습니다.

------------------------------------------------------------------

19번째 줄에서는

구조체 포인터 변수 pptr에 구조체 변수 pos2의 주소를 대입했습니다.

원래 구조체 변수 pos1의 주소가 들어있다가

pos2로 변경되었으므로

주소가 바뀌어 가리키는 대상이 변경 되었습니다.

이것을 그림으로 살펴보겠습니다.

------------------------------------------------------------------

구조체 포인터 변수 pptr이 가리키는 곳의

xpos4를 더하고

ypos5를 더하여

값을 변경했습니다.

------------------------------------------------------------------

20번째

21번째 줄에서 사용하는

-> 화살표 모양 연산자는

화살표 연산자라고 부르며

위에서 썼던 참조연산자와 기능이 같습니다.

구조체 포인터 변수에서 사용할 수 있으며

구조체 포인터변수가 가리키는 곳을 참조할수 있게 만드는 연산자 입니다.

20번째 줄에서

pptr이 가리키는 곳의 xpos1을 더하여 저장하고 있습니다.

21번째 줄에서

pptr이 가리키는 곳의 ypos2를 더하여 저장하고 있습니다.

------------------------------------------------------------------

구조체 포인터 변수 pptr이 가리키는 곳의

xpos4를 더하고

ypos5를 더하여

값을 변경했습니다.

------------------------------------------------------------------

그래서 이 코드를 실행하면

------------------------------------------------------------------

실행결과가 다음과 같습니다.

------------------------------------------------------------------