구조체 활용, 공동체, 열거형

2023. 2. 10. 22:11C언어/기본 개념

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