반응형

구조체(7)

 
 
구조체에서 포인터가 사용되는 경우는 2가지이다.
 
1. 구조체를 가리키는 포인터
2. 포인터를 멤버로 가지는 구초제
 
일단 먼저 구조체를 가리키는 포인터를 알아보자
 


 
 
※ 구조체를 가리키는 포인터 ※
 
변수를 가리키는 포인터를 만들 수 있는 것처럼 구조체를 가리키는 포인터도 만들 수 있다.
 
구조체 포인터는 다음과 같이 선언된다.
 
아래 예시 코드를 봐보자
 
ex :
 

struct student s = {20070001, "sean", 4.3};

struct student *p;

p = &s;

printf("학번 = %d 이름=%s 학점=%f \n", (*p).number, (*p).name, (*p).grade);

 
 
해석
 
포인터 p는 student 구조체를 가리킬 수 있는 포인터이다.
 
구조체 포인터 p와 구조체 변수 s를 연결하려면 주소를 p에 대입해줘야 하기 때문에
 
&연산자를 이용해서 구조체 변수의 주소를 구조체 포인터에게 보내주면 된다.
 
포인터를 이용하여 구조체의 멤버를 액세스 하려면 예시 문장과 같이 
 
(*p).number 이라고 하면 된다.
 
그렇다면 의미는 *p가 구조체를 가리키고 
 
가리키고 있는 구조체의 멤버를 참조하는 것이다.
 
참고로 표기할 때 () 없이 *p.number이라고 하면
 
' . '(닷) 연산자의 우선순위가 *(애스터리스크) 연산자보다 높기 때문이다.
 
그렇다면 위의 *p.number 문장의 순위는
 
p.number가 먼저 계산된 다음에 *(p.number)가 계산된다.
 
그러나 우리가 원하는 것은 *p를 먼저 계산하여 구조체 포인터가 가리키는
 
구조체 변수를 참조하고, 그다음 멤버를 참조하는 것이다.
 


 
※ 간접 멤버 연산자(indirect membership operator) ※
 
포인터를 이용해서 구조체의 멤버를 가리키는 것은 프로그램에서 자주 등장한다.
 
때문에 이것을 위한 C언어에서 제공하는 특수 연산자가 있는데,
 
그 연산자는 '->' 연산자이다.
 
'->' 연산자는 간점 멤버 연산자라고 불린다.
 
역할은 구조체 포인터를 이용하여 멤버에 접근할 때 사용하는 연산자이다.
 
ex :

p -> number;

 
해석
위 문장은 (*p).number과 같은 의미의 문장이며,
 
포인터 p가 가리키는 구조체 변수의 멤버 number을 참조한다라는 뜻이다.
 


 
p -> number; 이나 *(p).number 둘 중 어느 것을 써도 의미는 완전히 일치하지만,
 
간접 멤버 연산자를 사용하면 훨씬 간편하게 표기할 수 있어서 많이 사용된다.
 


 
※ 혼동하기 쉬운 구조체 변수와 구조체 포인터의 조합 ※
 
1. (*p).number
 
순서 : ()로 싸인 *p가 먼저 계산된 뒤에 멤버 number을 계산한다.
 
해석 : 포인터 p가 가리키는 구조체의 멤버 number를 참조한다 라는 의미이다.
 


 
2. p -> number
 
순서 : 우선순위가 높고 낮음이 없어서 왼쪽에서부터 오른쪽으로 계산한다.
 
해석 : 포인터 p가 가리키는 구조체의 멤버 number를 의미한다. 
(*p).number와 완전히 동일한 의미이다. 표기법만 다를 뿐이다.
 


 
3. *p.number
 
순서 : 아까도 설명했듯이' . '(닷) 연산자가 *(간접 참조) 연산자보다 우선순위가 높다.
 
위의 문장의 우선순위를 확실히 하기 위해서 ()를 추가하자면,
 
*(p.number)과 같은 표기법이 된다.
 
해석 : 구조체 p의 멤버 number가 가리키는 것을 참조하라는 의미이다.
 
이때 number가 꼭 포인터여야 한다. number가 포인터가 아니라면 오류이다.
 


 
4. *p -> number
 
순서 : 여기서는 ->(간접 멤버) 연산자가 *(간접 참조) 연산자보다 우선순위가 높다.
 
위의 문장의 우선순위를 확실히 하기 위해서 ()를 추가하자면,
 
*(p->number)과 같은 표기법이 된다.
 
해석 : p가 가리키는 구조체의 멤버 number가 가리키는 내용을 참조한다 라는 의미이다.
 
-
 
위의 내용들을 예제를 통해 알아보는데,
 
구조체를 가리키는 포인터의 예제 구조체(7-1)부터 차근차근 봐보자.

반응형

+ Recent posts