카테고리 없음

[구조체]04.구조체 배열

넓스 2017. 12. 23. 01:47


구조체 배열

배열의 요소가 될 수 있는 타입에는 제한이 없다. 따라서 구조체도 배열의 요소가 될 수 


있다.

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 구조체를 가리키도록 초기화해야 


하는데 동적 할당이 가장 쉬운 방법이기 때문이다. 동적할당된 구조체는 프로그램을 종료


하기 전에 반드시 해제해야 한다.