[C언어] 공부

5일차 공부내용
구조체, 공용체, 열거형

1. 구조체

구조체는 다양한 데이터형의 변수를 하나의 변수로 묶어준다.

struct 구조체형_이름
{
 데이터_형식 멤버_변수1;
 데이터_형식 멤버_변수2;
};
struct 구조체형_이름 구조체_변수;


위를 바탕으로 간단하게 활용을 해보자.

- 점수를 입력하면 성적표를 내주는 프로그램

- 실행결과

공부좀 열심히 해야겠다

구조체 변수의 다른 선언 방법

  1. 구조체와 변수를 동시에 선언
struct record
    {
        char name[10];
        int kor;
        int math;
        int social;
        float avg;
    };
    
    struct record re;
  1. 구조체형과 변수를 동시에 선언
struct record
    {
        char name[10];
        int kor;
        int math;
        int social;
        float avg;
    }re;
  1. typedef를 이용하여 선언
typedef struct _record
    {
        char name[10];
        int kor;
        int math;
        int social;
        float avg;
    }record;
    
    record re;  //구조체형을 굳이 길게 'struct record'라고 작성 할 필요없음

구조체 배열

구조체 변수도 일반 변수처럼 배열로 만들 수 있다.
이를 활용해서 이번엔 학생 3명의 성적표를 뽑아보자.

학생 3명의 성적표

실행결과

평균 구하는 방법이 똑같은 방법 반복이라서 반복문 안에 집어넣었는데
그렇다면 점수들도 반복문에 넣을 수 있지 않을까?

구조체 포인터

구조체 변수도 일반 변수와 마찬가지로 포인터를 사용할 수 있다.

struct record
    {
        char name[10];
        int kor;
        int math;
        int social;
        float avg;
    };
    
    struct record re;
    struct record *p;
    
    p = &re;
    
    p -> kor = 100;
일반 포인터 변수를 사용할 때 포인터 변수에 실제 값을 넣으려면  '*'을 사용하는 반면, 
구조체 포인터 변수의 멤버 변수에 실제 값을 접근하려면 '->' 연산자를 사용해야 한다.`

2. 공용체

공용체는 하나의 메모리를 서로 다른 두 변수가 같이 사용하는 것이다.
구조체에선 'struct'를 사용했지만 공용체는 'union'을 사용한다

union 공용체형_이름
{
 데이터_형식 멤버_변수_1;
 데이터_형식 멤버_변수_2;
}

union 공용체형_이름 공용체_변수;

공용체 사용 예시

실행결과

여기서 뭔가 이상한 점이 있다. 난 분명 u.tot에 300을 입력했는데 점수를 보면 321이라고 되어있다.
하지만 등급은 또 제대로 나왔다. 왜 이렇게 나오는 걸까?

현재 tot는 정수형 변수이므로 메모리 공간이 4byte가 할당 된 상태이다.
grade는 문자형 변수로 1byte의 공간이 필요하다.
공용체는 가장 크게 할당된 메모리 공간을 2개 이상의 변수가 공유하므로 이러한 결과가
나오게 된 것이다.

3. 열거형

열거형은 숫자를 나열하는 대신 특정한 기호로 대체하여 표현한 자료형이다.
'struct'도 아니고 'union'도 아닌 'enum'을 사용한다.

enum 열거형_이름
{
 기호_1;
 기호_2;
}
enum 열거형_이름 열거형_변수;
열거형은 개념이 살짝 다르다. 단순히 1, 2, 3등과 같은 숫자를 기호로 표현한 것이다.

열거형 사용 예시

실행결과

이처럼 열거형은 변수 이름이 아니라 데이터 값 이다.

좋은 웹페이지 즐겨찾기