구조체 활용, 공동체, 열거형
2023. 2. 10. 22:11ㆍC언어/기본 개념
728x90
구조체 포인터
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
struct score
{
int kor;
int eng;
int mat;
};
int main(void)
{
struct score a;
struct score(*sp) = &a;
(*sp).kor=100;
return 0;
}
|
cs |
13행: sp -> kor=100; 같음 구조체 포인터가 구조체 변수를 가킬 때는 '->'를 사용하면 된
. -> () [] 우선순위로 계산하기 때문에 *sp를 괄호로 묶어 줘야한다.
구조체 배열
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
struct address
{
char name[20];
int age;
char tel[20];
char addr[80];
};
int main(void)
{
struct address a[5] = {
{"홍길", 17, "111-1111", "서울"},{"박미", 24, "111-3164", "경기도"},{"허승", 50, "222-3164", "강원도"},
{"이연", 21, "124-3164", "전라도"},{"양준", 20, "333-3164", "경상도"}
};
int i = 0;
for (i = 0; i < 4; i++)
printf("%10s%5d%15s%20s\n",a[i].name, a[i].age, a[i].tel, a[i].addr);
return 0;
}
|
cs |
구조체 하나를 여러개 사용하고 싶을 때는 배열을 이용한다. 출력하는 방법은 a[0].name 방식으로 일반 구조체를 출력하는 방식하고 비슷하다.
위 내용을 한 번에 출력 할 수 있도록 함수를 만들어보자
void print_ary(struct address* p) { int i = 0; for (i = 0; i < 5; i++) { printf("이름: %s\n", p->name); printf("나이: %d\n", p->age); printf("번호: %s\n", p->tel); printf("주소: %s\n", p->addr); printf("\n"); p++; } } |
p->name 대신 p[i].name으로 사용해도 똑같다.
자기참조구조체
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <stdio.h>
struct list
{
int num;
struct list* next;
};
int main(void)
{
struct list a = { 10 }, b = { 20 }, c = { 30 };
a.next = &b;
b.next = &c;
struct list* tp = &a;
struct list* head = &a;
while (tp != NULL)
{
printf("%d\n", tp->num);
tp = tp->next;
}
return 0;
}
|
cs |
구조체 변수들을 '노드(node)'라고 한다. (데이터를 가지고 있고 다음 노드의 주소값을 가지고 있는 것)
노드들의 연결 해 놓은 것이 '연결리스트'(연결리스트는 자기참조 구조체로 구현한다.)
공용체
구조체같은 경우는 멤버들이 독립된 저장 공간 소유
공용체는 멤버가 많아도 멤버들중 가장 큰 멤버의 저장공간만 확보 나머지는 공간확보가 안 된다. 그래서 다른 멤버들은 확보된 저장 공간을 같이 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
union student
{
int num;
double grade;
};
int main(void)
{
union student a; // (double형)8바이트 저장 공간만 확보 된다.
a.num = 315;
printf("%d", a.num);
a.grade = 3.5; // 기존에 들어 있는 a.num 값은 3.5로 덮어 씌어지면서 삭제 된다.
printf("%d", a.num);
return 0;
}
|
cs |
메모리가 충분하다면 가능하면 사용하지 않는걸 권장
열거형
변수에 저장할 수 있는 정수 값을 기호로 정의한다.
1
2
3
4
5
6
7
8
9
10
|
#include <stdio.h>
enum season {spring, summer, fall, winter}; // 순서대로 0, 1, 2, 3 으로 바뀜
int main(void)
{
enum season a; // 4바이트 확보
a = spring;
if (a == spring)printf("%d", a);
return 0;
}
|
cs |
a= 0 이 나온다.
typedef 사용한 형 재정의
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <stdio.h>
struct student
{
char name;
int num;
int tle;
};
int main(void)
{
typedef int INT;
INT a, b; //INT가 int형이라는 의미다.
typedef* IP;
IP ap, dp; // ap, dp가 포인터 형으로 선언
typedef struct student Student; // 구조체를 사용할 때 사용한다.
Student a, * sp;
return 0;
}
|
cs |
typedef로 자료형을 정의할 수 있다. 15행처럼 구조체를 자료형으로 만들어서 16행처럼 사용 가능하다.
typedef struct { char name; int num; int tle; }Student; |
혹은 위처럼 구조체 정의 할 때 바로 사용할 수도 있다.
728x90
'C언어 > 기본 개념' 카테고리의 다른 글
전처리 지시자 (0) | 2023.02.15 |
---|---|
파일 개방 및 입출력 (0) | 2023.02.14 |
구조체 (0) | 2023.02.09 |
동적 할당 저장 공간의 활용 (0) | 2023.02.09 |
동적 할당 함수 (0) | 2023.02.08 |