C/C언어 이론

(9)struct

T_Y 2018. 6. 20. 13:42
반응형

구조체 (struct) - 사용자 정의 자료형(type)

- 다양한 타입의 변수들을 묶은 자료형

> 배열 : '같은 타입' 변수들의 나열

> 구조체 : '여러 타입' 변수들의 나열


- 구조체는 미리 선언하고 사용한다.

> 함수 선언부 위 (함수 원형에서 사용할 수 있기 때문)

> 구조체 선언 = 새로운 자료형 만들었다.


- 구조체 멤버로 배열, 포인터, 다른 구조체 등도 사용할 수 있다.

> 변수화 가능한 모든 것


- 구조체 변수는 멤버들을 묶은 '단위'이다.

> 일반 변수처럼 사용할 수 있다.


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#include <stdio.h>
#include <string.h>
 
// (1) 구조체의 기본 선언
struct STUDENT
{
    // 구조체가 가질 멤버 선언
    char    szName[20];    // 학생 이름
    int        iAge;        // 학생 나이
    double    dGrade;        // 학생 점수
 
    // 구조체 멤버 선언 시에는 초기화를 할 수 없다.
    // 이때는 공간이 만들어지는게 아님 (이런 자료형이 있다고 선언만 할 뿐)
    // 구조체를 이용해서 변수를 만들 때, 공간이 생성, 그때 초기화 진행
};
 
// (2) typedef 를 이용한 struct 글자 떼기
typedef struct _EMPLOYEE // _EMPLOYEE 사용하지 않을 이름이라서 그냥 _ 붙임 (필수 아님)
{
    char    szName[20];    // 사원 이름
    int        iAge;        // 사원 나이
    int        iSalary;    // 사원 월급
} EMPLOYEE;
 
//typedef
//struct _EMPLOYEE { char szName[20]; int iAge; int iSalary; } 
//EMPLOYEE;
 
typedef int KOREAIS_INT; // int 를 KOREAIS_INT 이름으로 사용할 수 있게 정의하겠다!
// 이 이후부터는 KOREAIS_INT 는 int와 같다. KOREAIS_INT iNum = 0;  ==  int iNum = 0; 
 
void main()
{
    // (1) 구조체를 사용하면 학생 10명일 때, 구조체 변수 10개면 된다.
    struct STUDENT sKim1;    // STUDENT 자료형으로 만든 변수 (초기화 되지 않음)
    struct STUDENT sKim2 = {0, }; // 초기화 (배열과 동일)
    struct STUDENT sLee     = { "이몽룡"2099.9 }; // 멤버 타입 순서에 맞게 초기값
 
    // (2) 구조체를 사용하지 않았다면, 각각의 변수를 10개씩 만들어야된다.. (이래서 구조체사용)
    char    szName1[20];    // 학생 이름
    int        iAge1;        // 학생 나이
    double    dGrade1;        // 학생 점수
 
    char    szName2[20];    // 학생 이름
    int        iAge2;        // 학생 나이
    double    dGrade2;        // 학생 점수
 
    // (3) typedef를 이용한 sturct 떼기
    EMPLOYEE sHong = {0, }; // <-- 구조체 다룰 때 가장 베스트! (typedef사용, 0 초기화)
    struct _EMPLOYEE sHong2 = {0, }; // _EMPLOYEE를 사용할 수는 있음.
 
    EMPLOYEE * pHong = NULL// 구조체는 단지 자료형이기 때문에, 포인터변수도 생성 가능
    pHong = &sHong; // 앞서 배운 포인터 개념과 동일. 자료형(type)만 바꼈을 뿐.
 
    // 구조체 변수명에서 점(.)을 붙이면 구조체 멤버를 접근(사용)할 수 있다.
    sHong.iAge = 20;
    sHong.iSalary = 2000000;
    // sHong.szName = "홍길동"; // szName은 문자'배열' -> 배열은 변경 불가
    strcpy(sHong.szName, "홍길동"); // string.h 필요
 
    printf("이름 : %s\n", sHong.szName);
    printf("나이 : %d세\n", sHong.iAge);
    printf("월급 : %d원\n", sHong.iSalary);
 
    // 구조체의 포인터 변수로 멤버를 접근할 때는 점(.) 대신  ->  사용
    pHong->iAge = 21// sHong 구조체를 따라가서 멤버를 사용!
    pHong->iSalary = 2500000;
 
    printf("이름 : %s\n", pHong->szName);
    printf("나이 : %d세\n", (*pHong).iAge); // *pHong = sHong과 같기 때문에 점(.) 사용
    printf("월급 : %d원\n", sHong.iSalary);
    // 함수 안에서 함수 외부의 구조체를 접근할 때 포인터 변수를 사용, 이때 -> 사용
 
    {
        int            iAge    = 0;
        int            iArr[5= { 0 };
        EMPLOYEE    sHan    = {0, };
        EMPLOYEE    sArr[5= {0, };
 
        iAge        = 20;
        iArr[0]        = 20;
        sHan.iAge    = 20;
        sArr[0].iAge = 20;
 
        printf("iAge = %d\n", iAge);
        printf("iArr[0] = %d\n", iArr[0]);
        printf("sHan.iAge = %d\n", sHan.iAge);
 
        scanf("%d"&iAge);
        scanf("%d"&iArr[0]);
        scanf("%d"&sHan.iAge);
    }
}
cs


반응형

'C > C언어 이론' 카테고리의 다른 글

(2-1)Data type  (0) 2018.10.02
(10)MemoryAllocation  (0) 2018.06.20
(8)Pointer  (0) 2018.06.20
(7)Array  (0) 2018.06.20
(6)Function  (0) 2018.06.20