구조체와 공용체 - 1
구조체와 필요성, 정의 방법과 구조체 변수, 구조체 배열과 구조체 포인터.
- 학습 목표
- 구조체의 개념과 필요성 이해.
- 구조체의 정의와 구조체 변수 선언.
- 구조체 멤버 참조.
- 구조체 배열 사용.
- 구조체 포인터 사용.
주요 용어
- 구조체 : 서로 다른 자료형을 갖는 자료들을 하나의 자료형으로 정으하여 사용하는 사용자 정의 자료형.
- 구조체 멤버 : 구조체를 구성하는 변수.
- 구조체 변수 : 정의된 구조체를 다루기 위한 변수.
구조체의 개념과 필요성
구조체(structure)
서로 다른 자료형을 갖는 자료의 모임을 하나의 자료형으로 정의하여 사용하는 자료형.
구조체 => 사용자 정의 자료형.
- 다양한 형식의 자료를 간결한 형식으로 표현 가능.
- 사용자가 새로운 형식을 정의하여 사용할 수 있음.
필요성
char car1_maker[15];
long int car1_km;
long int car1_cost;
char car2_maker[15];
long int car2_km;
...
long int car10_cost;
struct vehicle {
char maker[15];
long int km;
long int cost;
}
vehicle[10];
구조체의 정의와 변수 선언
구조체 정의
- 형식
-
struct 구조체_명 { 멤버 _1; 멤버 _2; ... }
-
- ex
-
struct score { int kor; int eng; ... }
-
구조체 변수의 선언
- 형식
-
struct 구조체_명 변수1, 변수2, 변수3;
-
- EX
-
struct score x, y[10], *z;
-
구조체 정의와 변수 선언 예 - 1
-
실제 자료 형태
- 학번 : 201XXXXXXX
- 이름 : name
- 국어 : 80
- 영어 : 89
- 수학 : 79
- 국사 : 80
-
구조체 정의
-
struct score { // 구조체 정의 char no[10]; // 구조체 멤버 char name[8]; int kor; int ent; ... } struct score x, y; // 구조체 변수 x, y 선언
-
구조체 정의와 변수 선언 예 - 2
struct score {
char no[10];
int ent;
...
} x, y; // 구조체 변수 x, y 선언
구조체 정의와 변수 선언 예 - 3
typedef struct score {
char no[10];
int ent;
...
} jumsu; // struct score를 jumsu라는 새로운 자료형으로 정의.
jumsu x, y; // 새로운 자료형 jumsu의 변수 x, y 선언.
구조체 변수의 초기화 및 참조
초기화
struct person {
char name[8];
int age;
char gender;
};
struct person x = {"asdf", 20, 'M'};
struct person {
char name[8];
int age;
char gender;
} x = {"asdf", 20, 'M'};
참조
. 연산자 사용
- 형식
- 구조체변수명.멤버명
- 예
- x.name
- x.age
#include <stdio.h>
#include <string.h>
struct person // person형 구조체 선언
{
char name[8];
int age;
char gender;
};
void main()
{
// 구조체변수 x 선언, 초기화
struct person x = {"asdf", 20, 'M'};
// 구조체변수 y선언
struct person y;
// 구조체멤버에 값 대입(문자열 처리할 경우 문자열 복사함수 strcp() 사용).
strcpy(y.name, "qwer");
y.age = 20;
y.gender = 'F';
printf("x -> %s, %d, %c\n", x.name, x.age, x.gender);
// x -> asdf, 20, M
printf("y -> %s, %d, %c\n", y.name, y.age, y.gender);
// y -> qwer, 20, F
}
구조체의 기억공간 구조
실제로 메모리가 할당될 때는 구조체 멤버 중 가장 큰 자료형의 크기로 할당 됨.
person.gender가 char 형이지만, 멤버 중 가장 큰 int 형의 크기인 4byte가 할당 됨.
#include <stdio.h>
#include <string.h>
struct person // person형 구조체 선언
{
char name[8];
int age;
char gender;
};
void main()
{
struct person x = {"asdf", 20, 'M'};
printf("sizeof(person.name) : %d byte\n", sizeof(x.name)); // 8
printf("sizeof(person.age) : %d byte\n", sizeof(x.age)); // 1
printf("sizeof(person.gender) : %d byte\n", sizeof(x.gender)); // 1
printf("sizeof(person) : %d byte\n", sizeof(x)); // 16
}
구조체 배열
동일한 구조를 갖는 구조체 변수가 여러 개 사용 될 때,
그 구조체 변수들을 대표하는 배열명을 설정하여 일반 배열과 같이 사용.
- EX : 3명의 개인 신상정보를 저장하기 위한 구조체 배열 선언.
struct person {
char name[8];
int age;
char gneder;
} x[3];
struct person y[3];
구조체 배열의 기억공간 표현
- | char name[8] | int age | char gender |
---|---|---|---|
x[0] | x[0].name | x[0].age | x[0].gender |
x[1] | x[1].name | x[1].age | x[1].gender |
x[2] | x[2].name | x[2].age | x[2].gender |
구조체 배열의 초기화
struct person x[3] = {
{"qwer", 20, 'M'}
, {"asdf", 21, 'F'}
, {"zxcv", 22, 'M'}
}
구조체 배열의 참조
// 구조체배열 2번째 요소 name에 'asdf' 저장.
strcp(x[1].name, "asdf");
// 구조체배열 3번째 요소 gneder에 'F' 저장.
x[2].gender = 'F';
// 구조체배열 3번째 요소 age 값을 변수 K에 저장.
K = x[2].age;
구조체 배열의 사용 예
#include <stdio.h>
#include <string.h>
struct person // person형 구조체 선언
{
char name[8];
int age;
char gender;
};
void main()
{
// 구조체 배열 초기화.
struct person x[3] =
{
{"qwer", 20, 'M'},
{"asdf", 21, 'F'},
{"zxcv", 22, 'M'}};
int i, sum = 0;
for (i = 0; i < 3; i++)
{
// 구조체 배열의 멤버 참조.
printf("name : %s, age : %d, gender : %c\n", x[i].name, x[i].age, x[i].gender);
sum = sum + x[i].age;
}
printf("SUM OF AGE : %d\n", sum);
}
구조체 포인터
포인터를 사용하여 구조체를 다룰 수 있게 함.
- 구조체를 보다 쉽게 다를 수 있음.
- 구조체 변수 선언시 * 를 붙여 포인터로 선언.
- 구조체 포인터는 포인터와 동일하게 주소값을 갖게 되며, 자료가 있는 곳을 가르킴.
구조체 포인터 선언
- 형식 : struct 구조체_명 *포인터변수_명;
- 사용 예 :
struct person *pt;
// 구조체 변수 man 선언
struct person man;
// 구조체 포인터 변수 pt 선언
struct person *pt;
// 구조체 포인터 변수의 초기화
pt = &man;
구조체 포인터의 기억공간 표현
구조체 포인터의 멤버 참조
- . 도트 연산자 사용
- (*pt).name
- 포인터 연산자 -> 사용
- pt -> name
구조체 포인터의 사용 예
#include <stdio.h>
struct student
{
char name[10];
int kor;
int math;
};
void main()
{
struct student classmate[4] =
{
{"A", 90, 80},
{"B", 80, 90},
{"C", 85, 85},
{"D", 70, 100}};
// 구조체 포인터 선언
struct student *p;
// 구조체 포인터 변수에 구조체의 시작주소 대입
p = classmate;
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);
}
실행 과정 (기억공간 표현)
728x90
반응형
'Language > C' 카테고리의 다른 글
[C] 파일 처리 함수 - 1 (0) | 2021.01.01 |
---|---|
[C] 구조체와 공용체 - 2 (0) | 2021.01.01 |
[C] 배열과 포인터 - 3 (0) | 2020.12.27 |
[C] 배열과 포인터 - 2 (0) | 2020.12.27 |
[C] 배열과 포인터 - 1 (0) | 2020.12.25 |