struct Person {
char name[30];
int age;
};
Person 구조체에서 name은 배열 이름이고, 배열 이름은 주솟값으로 변환됩니다. 따라서 &가 없어도 char 배열, 문자열을 받을 수 있습니다.
age는 int이고, 값입니다. 따라서 age로는 값에만 접근하게 되니, age 위치를 전달하려면 주솟값으로 변환해야 합니다. &age라고 써야 합니다.
struct Person *p[5];
*과 []이 함께 쓰이면 []가 우선순위가 높습니다.
p는 array 5 of pointer to struct Person라고 읽습니다. Person 구조체 포인터가 5개 들어있는 배열이라는 뜻입니다.
즉, 배열에 들어 있는 것은 Person 구조체에 대한 포인터 5개라는 뜻입니다. 포인터와 관련된 타입은 항상 영어로 읽는 습관을 들이는 게 좋습니다.
p는 배열 이름입니다. array 5니까 p[0]~p[4]까지 쓸 수 있고, 그 이상은 범위를 벗어나니 잘못된 코드입니다.
p[0]에 들어 있는 것은 pointer to sturct Person입니다. Person 구조체를 가리키는 포인터입니다. 포인터에서 멤버를 가리킬 때는 ->를 씁니다.
따라서 p[0]->name, p[0]->age로 접근합니다.
p[0]->name에서 name은 구조체에 배열로 선언되어 있고, 그 자체가 주솟값으로 처리되니까 &를 쓸 필요가 없습니다.
p[0]->age는 int이고, 값이니까 바로 입력받을 수 있습니다. 주소로 알려줘야 하므로 &p[0]->age가 됩니다.
[]과 ->의 연산자 우선순위가 높으므로 먼저 해석되고, 우선순위가 낮은 &가 마지막에 해석됩니다. []과 -> 중에서는 []가 더 높은 우선순위를 갖습니다.