[구조체]03.멤버연산자와 포인터멤버연산자
멤버연산자
구조체가 선언되어 있는 상태라면, 컴파일러는 읽으면서 각 멤버의 *오프셋과 타입을 기억한다.
멤버를 참조하라는 멤버연산자 . 을 만나면, 구조체 시작번지로부터 오프셋을 더한만큼을 이동한다. 그리고 이 위치에서 멤버의 타입 크기만큼을 읽는 기능을 수행한다.
구조체 소속일 뿐, 멤버는 일반 변수와 완전히 같다.
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가 멤버.