1. 구조체의 개념
구조체(structure)
- 서로 다른 자료형을 갖는 자료들의 모임을 하나의 자료형으로 정의하여 사용하는 자료형
구조체 => 사용자 정의 자료형
-다양한 형식의 자료를 간결한 형식 표현
-사용자가 새로운 형식을 정의하여 사용
구조체의 필요성
-10대의 차량에 대한 자료처리의 정우
일반변수 사용
char car1_maker[15]
long int car1_km;
long int car1_cost;
char car2_maker[15];
long int car2_km;
long int car2_cost;
...
chat car10_maker[15];
long int car10_km;
long int car10_cost;
구조체 사용
struct vehicle
{
char maker[15]
long int km;
long int cost;
} car[10]
2. 구조체의 정의와 변수 선언
구조체의 정의
형식 stuct 구조체명{
멤버1;
멤버2;
};
struct score{
int kor;
int eng;
...
};
구조체 변수의 선언
- struct 구조체명 변수명1, 변수명2, 변수명3;
struct score x, y[10], *z;
구조체 정의와 변수 선언 예1
실제자료형태
학번: 2102
이름: 홍길동
국어: 70
영어 85
수학 80
국사 90
구조체로 정의
struct score{ //구조체 멤버
char no[4]
char name[8]
int kor;
int eng;
int math;
int hist;
};
struct score X, Y // 구조체변수 X, Y 선언
구조체 정의와 변수 예 2
struct score{ //구조체 멤버
char no[4]
char name[8]
int kor;
int eng;
int math;
int hist;
}X, Y; //X, Y는 struct score의 구조체변수
에3
typedef struct score {
char no[4];
char name[8];
int kor;
int eng;
int math;
int hist;
}jumsu; // struct score를 jumsu라는 새로운 자료형으로 정의
jumsu X, Y; // 새로운 자료형 jumsu의 변수 x,y선언
3. 구조체 변수의 초기화 및 참조
예1
struct person{
char name[8]
int age;
char sex;
};
struct person X = {"홍길동", 20, 'M'};
예2
struct person{
char name[8]
int age;
char sex;
}X={"홍길동", 20, 'M'};
구조체 멤버의 참조
형식: 구조체변수명.멤버명 (도트 연산자 사용)
X.name
X.age
X.sex
//구조체 멤버의 참조 예1
#include <stdio.h>
#include <string.h>
struct person { // person형 구조체 선언
char name[8];
int age;
char sex;
};
void main() {
//구조체변수 X선언과 초기화
struct person X = { "홍길동",30, 'M' };
//구조체변수 Y선언
struct person Y;
//구조체멤버에 값 대입(문자열을 처리할 경우 문자열복사함수 strcpy()를 사용
strcpy(Y.name, "임꺽정");
Y.age = 35;
Y.sex = 'M';
printf("X의 정보: %s, %d, %c\n", X.name, X.age, X.sex);
printf("Y의 정보: %s, %d, %c\n", Y.name, Y.age, Y.sex);
}
/*
X의 정보: 홍길동, 30, M
Y의 정보: 임꺽정, 35, M
*/
구조체의 기억공간 구조
struct person{
char name[8];
int age;
char sex;
};
struct person X;
=> 구조체의 크기 sizeof(struct person) = 16byte (멤버들 중 가장 큰 자료형의 크기로 할당됨)
//구조체 멤버의 참조 2
#include <stdio.h>
#include <string.h>
struct person {
char name[8];
int age;
char sex;
};
void main() {
struct person X = { "홍길동", 30, 'M' };
printf("sizeof(person.name): %dbyte\n", sizeof(X.name));
printf("sizeof(person.age): %dbyte \n", sizeof(X.age));
printf("sizeof(person.sex): %dbyte \n", sizeof(X.sex));
printf("sizeof(person): %dbyte \n", sizeof(X));
}
/*
sizeof(person.name): 8byte
sizeof(person.age): 4byte
sizeof(person.sex): 1byte
sizeof(person): 16byte => 총 기억공간
*/
4. 구조체 배열
-동일한 구조를 갖는 구조체 변수가 여러 개 사용 될 때 그 구조체 변수들을 대표하는 배열명을 설정하여 일반 배열과 같이 사용
구조체 배열의 에
-3명의 개인 신상정보를 저장하기 위한 구조체 배열 선언
struct person{
char name[8]
int age;
char sex;
}X[3];
stuct person{
char name[8]
int age;
char sex;
};
struct person X[3];
구조체 배열의 기억공간 표현
struct person {
char name[8];
int age;
char sex;
};
struct person X[3];
구조체 배열의 초기화
struct person X[3] =
{{"홍길동",20,'M'},
{"황진이",22,'F'},
{"임꺽정",30,'M'}}
구조체 배열의 멤버 참조
strcpy(X[1].name, "홍길동"); //구조체배열 2번째 요소 name에 저장
X[2].sex = 'M';
K = X[2].age;
5. 구조체 포인터
포인터를 사용하여 구조체를 다룰 수 있게 함
-구조체를 쉽게 다룰 수 있다
-구조체변수 선언시 *를 붙혀 포인터로 선언
-구조체 포인터는 포인터와 동일하게 주소값을 갖게 되며, 자료가 있는 곳을 가르킨다.
구조체 포인터의 선언
형식: struct 구조체명 * 포인터변수명;
사용 예: struct person *pt;
struct person {
char name[8];
int age;
char sex;
};
struct person man; // 구조체 변수 man 선언
struct person *pt; // 구조체 포인터 변수 pt선언
pt = &man; //구조체 포인터 변수의 초기화
구조체 포인터의 기억공간 표현
sturct person {
char name[8]
int age;
char sex;
};
sturct person man;
struct person *pt;
pt = &man;
구조체변수(man)으로 공간이 확보되고 각각의 멤버는 용량을 가진다.
구조체 포인터의 멤버참조
-도트 연산자(.)를 사용 괄호를 사용해서 우선순위를 조절해야함
(*pt).name
-포인터 연산자 (->)를 이용
pt -> name
// 구조체 포인터의 사용예
#include <stdio.h>
struct student {
char name[10];
int kor;
int math;
};
void main() {
struct student hs[4] = { {"KIM HG",90,95},{"Lee SY",85, 90}, {"PARK GS", 70, 85}, {"CHOI HJ", 95, 75} };
struct student* p; //구조체포인터 선언
p = hs;//구조체 포인터 변수에 구조체의 시작주소를 대입
//첫 번째 구조체의 각 멤버를 참조
printf("%s %d %d\n", p->name, p->kor, p->math);
p += 3;
printf("%s %d %d\n", p->name, p->kor, p->math);
p--;
printf("%s %d %d\n", p->name, p->kor, p->math);
}
/*
KIM HG 90 95
CHOI HJ 95 75
PARK GS 70 85
*/
프로그램 실행과정(기억공간 표현)
struct student hs[4]={{"KIM HG", 90, 95}, {"LEE SY", 85, 90}, {"PARK GS", 70, 85}, {"CHOI HJ", 95, 75}};