[구조체]04.구조체 배열
구조체 배열
배열의 요소가 될 수 있는 타입에는 제한이 없다. 따라서 구조체도 배열의 요소가 될 수
있다.
tag_Friend arJuso[10];
크기 10의 정수형 배열을 선언하는 것과 형식상 다를 바가 전혀 없다
구조체를 구성하는 멤버는 타입이 모두 다르지만 배열을 구성하는 요소는 모두 구조체라
는 같은 타입이므로 배열이 될 수 있다
배열속에 구조체가 있고 구조체 속에는 멤버들이 있다
첨자 연산자 [ ]와 멤버 연산자 .은 둘 다 1순위이고 왼쪽 우선의 결합 순서를 가지므로
arJuso[2]가 먼저 연산되어 배열에서 2번째 구조체를 찾는다. 다음으로 멤버 연산자에
의해 2번째 구조체의 Age 멤버를 찾을 것이다. arJuso.Age[2]=30; 이 아님을 유의하자.
반대의 경우를 보자. 구조체가 배열의 요소가 될 수 있는 것과 마찬가지로 배열도 구조
체의 멤버가 될 수 있다.
다음 코드는 Friend 구조체의 멤버인 Name 배열의 첫 번째 요소에 문자 상수 'K'를 대입
한다.
tag_Friend Friend;
Friend.Name[0]='K';
이번에는 멤버 연산자가 먼저 실행되어 Friend 구조체의 Name 멤버를 먼저 찾으며 다음
으로 첨자 연산자가 실행되어 Name 배열의 첫 번째 요소를 참조하게 된다.
tag_Friend *pJuso[10];
★pJuso는 일단은 크기 10의 배열이되 tag_Friend형의 구조체를 가리킬 수
있는 포인터를 배열 요소로 가진다.이 배열의 각 요소인 pJuso[0], pJuso[1], pJuso[2]
등은 tag_Friend형의 구조체를 가리킬 수 있으며 이런놈이 10개 있다.
((((( 그림 )))))
이 상태에서 pJuso 배열에 저장된 포인터가 가리키는 구조체의 한 멤버를 참조하고 싶다
면 다음과 같이 한다.
pJuso[3]->Age=40;
[ ] 연산자가 제일 먼저 실행되어 pJuso 배열의 네 번째 요소값을 먼저 읽는데 이 값은
tag_Friend 구조체를 가리키는 포인터이다. 이 포인터가 가리키는 곳에 저장되어 있는
tag_Friend 구조체를 먼저 읽고 이 구조체의 멤버인 Age를 참조했다.
#include <Turboc.h>
void main()
{
struct tag_Friend {
char Name[10];
int Age;
double Height;
};
// 구조체 배열 사용예
tag_Friend arJuso[10];
arJuso[5].Age=30;
// 구조체에 속한 배열 사용예
tag_Friend Friend;
Friend.Name[0]='K';
// 배열에 속한 구조체에 속한 배열 사용예
arJuso[1].Name[2]='J';
// 구조체 포인터 배열 사용예
tag_Friend *pJuso[10];
int i;
for (i=0;i<10;i++) {
pJuso[i]=(tag_Friend *)malloc(sizeof(tag_Friend));
}
pJuso[3]->Age=40;
for (i=0;i<10;i++) {
free(pJuso[i]);
}
}
예제에서는 구조체 포인터 배열 pJuso를 초기화하기 위해 malloc 함수를 사용하여 동적
으로 할당했다. pJuso 배열의 모든 요소가 tag_Friend 구조체를 가리키도록 초기화해야
하는데 동적 할당이 가장 쉬운 방법이기 때문이다. 동적할당된 구조체는 프로그램을 종료
하기 전에 반드시 해제해야 한다.