※ 구조체 (struct) => 하나의 "자료형"처럼 사용, 다른 언어의 class와 비슷.

§ 구조체의 형태

struct 구조체이름 {
    해당 type이
    가졌으면 하는 멤버
};

struct의 크기는 멤버의 크기와 동일하다.

struct Point {
    int age; // 4 byte
    char name[20]; // 20 byte
    int x[20]; // 80 byte
}; // 총 104 byte

 

 

§ 구조체와 배열

#include <stdio.h>

struct Person{
    char name[20];
    char phone[20];
    int age;
};

int main(){
    struct Person arr[3];
    int i;
    for (int i = 0; i < 3; i++) {
        scanf("%s %s %d", arr[i].name, arr[i].phone, &arr[i].age);
    }
    for (int i = 0; i < 3; i++) {
        printf("%s %s %d \n", arr[i].name, arr[i].phone, arr[i].age);
    }
}

 

 

§ 구조체와 동적배열

 

 

 

 

 

 

※ 구조체와 포인터

 

 

 

 

 

 

 

※ 구조체와 typedef 선언

§ typedef 형식과 특징

typedef를 선언함으로 인해 struct 뒤의 이름을 생략할 수 있다.

 

 

 

 

 

※ 함수의 구조체 전달

- 함수는 항상 1개의 값만 return 할 수 있다. 따라서 값을 여러개 return 받고 싶을 때! 사용한다.

 

 

 

 

 

 

 

 

※ 구조체를 이용한 추상화

 

 

 

 

 

 

 

 

※ 공용체 (Union)

 

 

[ Mini Project ]

1. 프로그램 사용자로부터 int형 정수를 하나 입력받음

2. 입력받은 정수의 상위 2바이트와 하위 2바이트를 양수로 출력

3. 상위 1바이트와 하위 1바이트에 저장된 ASCII문자를 출력

 

 

 

[정답 코드]

#include <stdio.h>

typedef struct {
    unsigned short upper;
    unsigned short lower;
}DBShort;

typedef union {
    int iBuf;
    char cBuf[4];
    DBShort sBuf;
}icDBuf;

int main(){
    icDBuf buf;
    scanf("%d", &(buf.iBuf));
    
    printf("상위 2byte: %u \n", buf.sBuf.upper);
    printf("하위 2byte: %u \n", buf.sBuf.lower);

    printf("상위 1byte ASCII: %c \n", buf.cBuf[0]);
    printf("하위 1byte ASCII: %c \n", buf.cBuf[3]);
}

 

 

 

 

 

 

 

※ 열거형 (사실 #define 전처리기를 더 많이 사용함)

#include <stdio.h>

typedef enum{
    Do=1, Re=2, Mi=3, Fa=4, So=5, La=6, Ti=7
}Syllable;

void song(Syllable s){
    switch(s){
        case Do:
            puts("도는 도라지"); return;
        case Re:
            puts("레는 레코드"); return;
        case Mi:
            puts("미는 미나리"); return;
        case Fa:
            puts("파는 파랑새"); return;
        case So:
            puts("솔은 솔방울"); return;
        case La:
            puts("라는 라디오"); return;
        case Ti:
            puts("시는 시냇물"); return;
    }
}

int main(){
    Syllable tone;
    for (tone = Do; tone <= Ti; tone++) {
        song(tone);
    }
}

+ Recent posts