[KNK] CH16 - Structures, Unions, and Enumerations

2 분 소요

CH 16 Structures, Unions, and Enumerations

구조체(structure, struct)

구조체 선언

struct {
  int number;
  char name;
  int on_hand;
} part1, part2;
  • struct{..}: type
  • part1, part2: identifer

구조체 초기화

struct {
  int number;
  char name;
  int on_hand;
} part1 = {528, "Disk drive", 10},
  part2 = {914, "Printer cable", 5};

(c99)정해진 자료형보다 적게 초기화할 경우 나머지는 0으로 초기화

지정된 초기화(c99)

{
    .number = 528, 
    .name = "Disk drive", 
    .on_hand = 10
}
  • 장점: 순서 상관 없음(나중에 변수 타입이 변경되도 상관 없음)
    {
      .number = 528, 
      "Disk drive", 
      .on_hand = 10
    }
    // "Disk drive"는 number로 들어감 fail되면 0으로 초기화
    

Operations on Structures

  • 멤버 접근: dot(.) 으로 접근
  • 복사: part2=part1
  • 배열 복사(if two structures are compatiable)
struct { 
    int a[10]; 
} a1, a2;
a2=a1; // 각 벰버로 복사함

구조체 타입

구조체 태그 선언

struct part{
  int number;
  char name[NAME_LEN+1];
  int on_hand;
}; // 필요하면 구조체 변수 이름까지 (마지막 세이콜론 꼭!!)
// part가 structure tag
  • 사용할 땐 struct part part1, part2;
  • Linked list를 쓸 땐 mandatory (??)

구조체 타입 선언

typedof struct{
  int number;
  char name[NAME_LEN+1];
  int on_hand;
 } Part;
Part part1, part2;

구조체를 매개변수 또는 리턴값으로 사용하기

  • 비효율적이다.
  • automatic storage duration한 경우엔 함수 내에서 어떤 expression으로도 initialize가능

Compound Literals(c99)

print_part( (struct part) {528, "Disk drive", 10} );

인 경우 변수를 만들지 않고 아래와 같이 parameter로 사용 가능

print_part( (struct part) {.number=528, .name="Disk drive", .on_hand = 10} );
// uninitialized member is 0

Nested 구조체와 구조체 배열

Nested 구조체와 구조체 배열이 가능하다.

Nested 구조체

struct ...{
struct...
};

구조체 배열

struct part inventory[100];
inventory[i].number
inventory[i].name[0]

구조체 배열 초기화

struct dialing_code{
  char *country;
  int code;
  };

const struct dialing_code country_code[]={ 
  { "Argentina" , 54 } , 
  { "Bangladesh" , 880 }
  }; //inner brace is optional

struct part inventory[100]{ 
  [0].number = 528, 
  [0].on_hand = 10, 
  [0].name[0] = 0
  }; // (c99)

Unions

구조체와 거의 동일하지만 메모리 공간을 서로 공유한다. 따라서 Union의 크기는 가장 큰 멤버 데이터의 크기에 따라 결정된다.

Declaration and Initialization

union{
  int i;
  double d;
} u={0}; (only i=0)
u={.d=10.0}; (c99)

usage

  1. 공간 절약
  2. 혼합된 자료구조를 만들 수 있음

Tag Field 를 union에 추가하기

어떤 변수가 의미있는 변수인지 알려주는 변수

#define INT_KIND 0
#define DOUBLE_KIND 1

typedef struct {
  int kind; //tag field
  union{
    int i;
    double d;
    } u;
} Number;

Enumerations

프로그래머에 의해 이름붙여진 값들의 리스트

Declaration

enum { CLUBS, DIAMONDS, HEARTS, SPADES } s1, s2;

Enumeration Tags and Type Names

enum suit { CLUBS, DIAMONDS, HEARTS, SPADES };
enum suit s1, s2;

sizeof operator

sizeof 연산자를 구조체에 사용하면 컴파일러에 따라 결과가 다르게 나온다. 어떤 컴퓨터는 어떤 숫자(1,2,4 …)의 배수 형태로 데이터를 저장하기 때문이다.

struct{
   int a;
   char b;
  } s;
  printf("%d",sizeof(s)) // 8출력 

이경우 int a는 4바이트 char b는 1바이트이고 구조체 마지막 3바이트에는 hole(unused byte)이 생긴다.

댓글남기기