카테고리 없음

[구조체]03.멤버연산자와 포인터멤버연산자

넓스 2017. 12. 23. 01:34

멤버연산자                                                              


구조체가 선언되어 있는 상태라면, 컴파일러는 읽으면서 각 멤버의 *오프셋과 타입을 기억한다.

멤버를 참조하라는 멤버연산자 . 을 만나면, 구조체 시작번지로부터 오프셋을 더한만큼을 이동한다. 그리고 이 위치에서 멤버의 타입 크기만큼을 읽는 기능을 수행한다.

구조체 소속일 뿐, 멤버는 일반 변수와 완전히 같다.


*오프셋(offset) :  시작 번지로부터 멤버까지의 거리

tag_People People;

People.Age = 5(임의); 라고 했을 때 과정을 그림으로.



포인터 멤버 연산자 (->)                                              


struct tag_People 

{

     char Name[10];

     int Age;

     double Height;

};

int main()

{

tag_People People;

tag_People *pPeople; // tag_People 타입을 가지는 변수(구조체's 시작박스)를 가르키는 pPeople 포인터변수.

pPeople=&People;

(*pPeople).Age=24; // People.Age=24과 같다고 할 수 있다

}

컴파일러가 코드를 해석할 때, 멤버연산자는 1순위이고 포인터 연산자는 2순위이다.

따라서 (*pPeople).Age와 같이 괄호가 반드시 포함되어야된다. 그렇지 않으면 *(pPeople.Age)로 잘못해석되기 때문이다. 

또 멤버연산자의 왼쪽에는 반드시 구조체여야하는데, 괄호가 빠지면 pPeople을 마주하게된다.  구조체가 아니라, 구조체를 가르키는 포인터기 때문에 이는 오류이다.


(*pPeople).Age의 직관적인 표현을 위해 포인터 멤버 연산자 -> 가 등장한다.

포인터 멤버 연산자(->)를 기준으로 좌변은 구조체 포인터, 우변은 멤버이름을 취한다.

(*pPeople).Age는 pPeople->Age와 동일하다.

 pPeople 이 People구조체를 가리키는 포인터이고 Age가 멤버.