<구조체>
struct student { // student는 구조체 명, 태그, 메모리가 잡히지 않음
int id; //멤버
int midterm; //멤버
int final; //멤버
};
student에 대한 기본 틀
기본 자료형이 모여서 파생자료형이 되는데 구조체는 파생자료형임.
- 구조체 변수 구조체변수 선언, 메모리가 잡힘
struct student aStudent; // aStudent는 구조체 변수
*struct student자체가 자료형이 됨.
=> 구조체는 자료형이고, 그 자료형으로부처 변수 선언이 가능한 것임.
구조체 변수 초기화 선언과 동시에 초기화
struct student aStudent = {19950001, 100, 50} -> 각각의 멤버에 초기값 부여.
. (dot)연산자 : 구조체 변수 멤버 각각에 접근.
//구조체 멤버 각각에 값 설정
aStudent.id = 19950001
aStudent.midterm = 100;
aStudent.final = 50;
//구조체 멤버의 값을 입력받는다.
printf("학번 입력:");
scanf("%d", &aStudent.id );
printf("중간고사 성적 입력:");
scanf("%d", &aStudent.midterm );
printf("학기말고사 성적 입력:");
scanf("%d", &Student.final );
//구조체 멤버의 값을 출력한다.
printf("학번: %d 중간: %d 학기말: %d\n", aStudent.id, aStudent.midterm, aStudent.final );
//중간고사와 학기말고사 성적을 더해 출력한다.
printf("학번 %d의 총점은 %d이다\", aStudent.id, aStudent.midterm + aStudent.final );
struct customer {
char name[20];
int age;
}; //꼭 ;를 써줘야 함.
int main(void) {
struct customer aMan, aWoman;
strcpy(aMan, "에릭"); // 문자열 복사
//aMan.name = "에릭" 이 안 되는 이유는 name은 상수이므로, 값을 넣을 수 없음.
aMan.age = 35;
printf("여자 고객의 이름은?");
scanf("%s", aWomen.name); //배열이므로 &를 쓰지 않음.
printf("나이는?");
scanf("%d", &aWomen.age); //정수형이므로 &를 써야 함.
printf("%s은 %d이다.", aMen.name, aMen.age);
<구조체 배열>
struct student sList[3]; // sList[0], sList[1], sList[2]는 각각 구조체 변수
sList[0].id
sList[0].midterm
sList[0].final
sList[1].id
sList[1].midterm
sList[1].final
sList[2].id
sList[2].midterm
sList[2].final
- 구조체 배열 초기화
struct student sList[3] = {{19950001, 100, 50}, {20170001, 100, 100}, {20170002, 10, 20}};
for (i = 0; i < 3; i++) {
printf("학번, 중간, 학기말 입력: ");
scanf("%d %d %d", &sList[i].id, &sList[i].midterm, &sList[i].final);
}
+)
struct student {
char name[20];
int midterm;
int final;
};
student 구조체의 크기는 28바이트임.
struct student {
char name[19];
int midterm;
int final;
};
student구조체의 크기는 20바이트임.
name배열의 크기가 줄어들었는데 구조체의 크기가 같은 이유?
- 구조체는 멤버 중 가장 큰 자료형의 배수형으로 나옴. 그래서 4바이트의 배수형으로 나옴.
또 구조체는 멤버의 위치에 따라서도 크기가 달라짐.구조체 말고 공용체도 있음.(수업에서 배우지 않음)