반응형

구조체(6)

 

 

우리가 전에 썼던 student 구조체 변수는 학생 한 명의 데이터만을 저장할 수 있다.

 

하지만 우리는 일반적으로 몇백명의 많은 학생들의 데이터를 처리하게 된다.

 

따라서 여러 개의 구조체가 필요하게 되는데, 이런 경우에는 통상적으로

 

구조체의 배열을 사용하게 된다.

 

구조체의 배열이란, 구조체가 여러개 모인 구조이다.

 

쉽게 예시를 들자면,

 

ex :

 

int a[10];

 

 

해석

 

위에 예시 문장은 int형 a라는 변수가 10개가 생성되는 것이다.

 

그렇다면 메모리 크기는 int형이 4byte이니깐 4byte * 10을 하면

 

40byte가 할당되고 이는 연속적인 데이터 크기이다.

 

즉 메모리에서 40byte가 띄엄띄엄 있지 않고 연속적으로 나열되어있다.

 


 

※ 구조체 배열의 선언 ※

 

구조체 배열은 int나 char 배열을 선언하는 것과 비슷하다. 

 

다만, 앞에 추가로 struct 라는 키워드만 적어주면 된다.

 

이해 차원에서 말하자면 int a[10]; 이 문장에서 앞에 struct를 붙여서 

 

struct int a[10]; 처럼 써야 구조체 배열의 선언이 되는 것이다.

 

위 문장은 이해를 돕기 위한 문장이므로 저렇게 쓰면 안 된다는 걸 알아두자.

 


 

ex :

 

struct student
{
	int number;
	char name[20];
	double grade;
};

struct student list[100];

 

 

해석

 

위 예시 문장을 보면 student 구조체의 배열을 list라는 이름으로 선언하였다.

 

위의 구조체 배열은 학생 100명의 데이터를 저장할 수 있다.

 

각 학생들의 데이터는 구조체로 표현되어 있는 것이다.

 

배열에서 인덱스가 2인 원소에 있는 구조체에 값을 저장해 보자.

 

배열의 인덱스는 0부터 시작하는 것을 명심하자

 

ex :

 

list[2].number = 24;

strcpy(list[2].name,"홍길동");

list[2].grade = 4.3;

해석

구조체 배열 list의 인덱스 번호가 2이므로 실제로는 3번째 학생을 가리킨다.

 

즉 3번째 학생의 번호와 이름 학점을 입력한 것이다.

 

 


 

※ 구조체 배열의 초기화 ※

 

구조체의 배열도 초기화가 가능하다.

 

다만 배열 초기화 안에 구조체 초기화가 들어가야 하므로 

 

중괄호 안에 또 중괄호가 필요하게 된다.

 

ex :

 

struct student list[3] = { {1, "Park", 3.42}, {2, "Kim", 4.31}, {3, "Lee", 2.92} };

 

해석

student 구조체의 배열 list가 선언됐고 각각 구조체의 초기화를 {}로 감쌌고

 

이 구조체의 초기화들을 {}으로 다시 한번 감쌌다.

 

 

여기서 주의할 점은 각 요소들의 초기화 값 사이에는 콤마가 있어야 한다는 것인데, 

 

마지막 원소 다음에는 콤마를 붙이지 않는다.

 

구조체 배열의 초기화를 2차원 배열의 초기화랑 비슷하다고 보면 된다.

 

다만 구조체 배열의 초기화는 구조체의 초기화와 배열의 초기화이다.

 

2차원 배열의 초기화는 2번째 원소의 초기화와 1번째 원소의 초기화이다.

 

이 차이점만 있을 뿐 쓰는 거랑은 비슷하다고 이해하면 된다.

 


 

참고로 구조체 배열에서 원소의 개수를 자동으로 알아내려면 배열에서 계산하는 것과 같이

 

전체 배열의 총 바이트 수를 개별 원소의 바이트 수로 나누면 된다.

 

a = sizeof(list) / sizeof(list[0]);

 

OR

 

a = sizeof(list) / sizeof(struct student);

 

-

 

이제 구조체의 배열 예제를 구조체(6-1)에서 보도록 하자

반응형

+ Recent posts