[KNK] CH16 - Structures, Unions, and Enumerations
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
- 공간 절약
- 혼합된 자료구조를 만들 수 있음
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)이 생긴다.
댓글남기기