Anonymous 구조체
anonyamous 구조체는 이름이 명명되지 않은 구조체인 구조체 멤버이다. 즉 중첩된 익명의 구조체 멤버 구조이다.
ex)
struct person
{
int id;
struct { char first[20]; char last[20];};
};
구조체 초기화
struct person ted = {8483, {"Ted", "Grass"}};
구조체는 하나의 객체에 여러종류의 데이터를 저장할 수 있기 때문에, 데이터 베이스를 구축하는데 쓰이는 중요한 도구이다. 데이터 베이스 파일은 데이터 객체를 원하는 만큼 가질 수 있다. 이러한 데이터 객체 즉, 구조체에 저장되는 정보의 총 집합을 레코드(record)라 부른다. 각각의 개별 항목을 필드(field)라고 부른다.
구조체의 저장된 정보 즉 레코드를 가장 확실하게 저장하는 방법은, fprintf()를 사용하는 것이다.
ex)
fprintf(Fstream, "%s %s "%.2f\n",primer.title,primer.author, primer.value);
위의 방법은 많은 수의 멤버를 가지고 있는 구조체라면 사용하기 어렵다.
많은 멤버를 가진 구조체를 파일에 저장할 때 사용하기 좋은 방법은 fread() 와 fwrite()를 사용하여 구조체를 크기 단위로 읽고 쓰는것이다.
주의할 점은 fread()와 fwrite()는 바이너리 모드의 읽기와 쓰기이다.
fwrite(&primer, sizeof(struct book),1,Fstream);
위의 함수는 primer 시작 주소로 부터 해당 구조체 크기만큼의 모든 바이트를 Fstream에 연결된 파일에 복사하는 것이다. 위 함수 fwrite()와 fread()함수는 한번에 한 필드를 읽고 쓰는것이 아니라 하나의 레코드를 읽고 쓸 수 있다.
바이너리 모드에서 데이터를 저장하는데 단점은 서로 다른 시스템마다 다른 바이너리 모드를 사용할 수 있어 이식성이 낮다.
큐(queue), 바이너리 트리(binary tree), 힙(heap), 해시 테이블(hash table), 그래프(graph) 등과 같은 데이터 형들은 구조체를 연결하여 만든다. 일반적으로, 각 구조체는 한두개의 데이터 항목과, 같은 유형의 다른 구조체를 가리키는 한두개의 포인터를 가진다. 이 포인터들은 한 구조체를 다른 구조체에 연결하여, 상용자가 구조체들의 집합 전체를 탐색할 수 있는 경로를 제공한다.
공용체
공용체(union)는 같은 메모리 공간에 서로 다른 데이터형들을 저장할 수 있게 한다. 공용체의 용도는, 순서가 규칙적이지 않고 미리 알 수도 없는 데이터형들의 혼합을 저장하도록 설계된 테이블이다.
공용체는 구조체와 같은 방식으로 설정한다.
ex)
union hold{
int digit;
double bigfl;
char letter;
};
위와 같은 형태의 구조체는 int형 값 1개, double 형 값 1개, char형 값 1개 총 3개의 값을 저장할 수 있지만 union 공용체는 하나의 값 int 또는 double 또는 char형 중 하나의 데이터형태의 하나의 값을 저장할 수 있습니다.
hold형 공용체 변수 정의 예시
ex)
union hold fit;
union hold save[10];
union hold * pu;
공용체의 경우 컴파일러는 크기가 가장 큰 멤버를 저장할 수 있을 만큼의 공간을 할당 합니다. 공용체 hold의 경우 가장 크기가 큰 멤버는 double 형 이므로 8바이트 메모리를 할당받습니다. 두번째 선언인 고용용체 배열은 가장 큰 멤버의 크기 double형의 메모리공간 8byte 10개짜리 메모리공간을 할당받습니다. 세번째는 공용체 주소를 담을 메모리 공간입니다.
공용체 사용
ex)
fit.digit = 23; //23이 fit에 저장된다.
fit.bigfl = 2.0; //2.0이 23을 대체한다. 8바이트 사용
fit.letter = 'h'; //'h'가 2.0을 대체한다. 1바이트 사용
도트(.) 연산자를 통해 각 멤버의 데이터형을 사용할 수 있다. 한번에 하나의 값만 저장된다. 저장할 공간이 충분하더라도 하나의 값만 사용할 수 있다.
공용체 포인터와 구조체 포인터를 사용하는 방법은 같다.
pu = &fit;
x = pu -> digit;