본문 바로가기

Language/C

응용자료형의 배열


●응용자료형의 배열

◎비트 필드 또는 팩키드 구조체

비트 필드 또는 팩키드 구조체를 사용하면 구조체의 저장공간을 최소화 할 수 있다.

구조체의 필드를 비트단위로 설정이 가능하다.

<형식>

struct struct-name{

field-type field-name : bit=number;

};

형식은 구조체와 동일하지만 필드명 뒤에 (:)를 붙이고 비트 수를 입력한후 세미콜론을 입력한다.

ex)

struct item{

unsigned int lis : 1; /*항목이 목록 안에 있다면 참*/

unsigned int seen : 1;/*이 항목이 보여졌다면 참*/

unsigned int number : 14;/*항목 번호*/

보통 비트 필드 구조체는 unsigned형을 주로 이용 한다.

 

 

위 의 예문을 일반적인 구조체를 사용하면 int 형으로 각각 4바이트씩 할당이되어 쓸모없는 메모리가 낭비 된다. 위의 팩키드 구조체를 사용 하면 필요한 만큼이 저장 비트를 설정하여 사용할수 있으므로 실 프로그램 상에서 위의 소스는 2바이트로 충분히 모든 할당이 가능하다.

하지만 팩키드 구조체를 사용시 신중하게 생각하여야 한다. 비트 필드에서 데이터를 가져오는 것은 상당히 느리기 때문에 저장 공간이 문제가 되지 않는다면 구태여 사용할 필요가 없다. 또한 scanf()함수로 키보드를 입력받을수 없다. 왜냐하면 비트단위는 주소를 같지 못하기 때문에 scanf("%d",&in.seen); 의 선언자체가 불가능한 것이다. 키보드로 입력을 받기 위해서는 int형 변수를 선언한뒤 그 변수에 값을 입력시키고 대입시키는 형식으로 사용해야하는 것이다. 그리고 이는 프로그래밍 과정에서 유연성이 떨어진다는 단점이 있다.

◎구조체 배열

말그대로 구조체를 배열처럼 사용한다는 것이다. 구조체 변수도 배열을 선언하여 사용할수 있다. 구조체 선언은 같고 구조체 변수의 선언에서 배열로 선언을 하면된다. 변수의 초기화는 다차원 초기화 와 비슷하다.

<형식>

struct student{

int number;

int name[30];

int year;

};

/*student 구조체 안에 class배열을 선언하고 초기화 하는구문이다. 멤버 참조연산자로 차례대로 초기화를 한다*/

struct student class[5] = {{314."Park jun".4}

{315."Jo you".10}

{318."Kim jung".12}};