공용체


 공용체는 하나의 공간을 동으로 사하는 자료형입니다. 공용체 안에 여러 자료형이 있을때, 가장 큰 자료형 하나 만큼만 메모리를 점유하기때문에, 메모리를 절약할 수 있다는 큰 장점이 있습니다.

 공용체의 사용은 struct 대신 union을 사용한다는 점을 제외하면 구조체와 거의 유사합니다.

----------------------------------------------------------------------------------------

// 공용체 정의

union test{

int age;

char *name;

char *hobby;

}; 


// 공용체 필드에 접근

union [공용체 이름] [공용체 변수이름];

union test p1;

[구조체 변수이름].[구조체 필드이름];

p1.name;

----------------------------------------------------------------------------------------


 공용체는 하나의 공간을 사용하기 때문에 모든 필드의 시작주소가 같습니다. 아래코드는 test라는 공용체를 만들어서 a,b,c 필드의 주소를 출력하는 코드입니다.

----------------------------------------------------------------------------------------

#include <stdio.h>


union test{

int a;

char *b;

double c;

};


int main()

{

union test a;


printf("int형 주소    : %d \nchar형 주소   : %d \ndouble형 주소 : %d \n", &a.a, &a.b, &a.c);

return 0;

}

----------------------------------------------------------------------------------------

이처럼 전부 같은 주소가 출력됩니다.


 아래 코드는 구조체를 활용해 성적 입력 및 조회하는 코드를 작성해 봤습니다.

----------------------------------------------------------------------------------------

#include <stdio.h>

#include <string.h>

#pragma warning(disable:4996)


typedef struct{ // 이렇게 구조체를 선언하면 사용할 때 struct [구조체 이름] 대신 구조체 이름만 가지고 사용할 수 있습니다. 

char name[20];

int math;

int com;

}student;


void insert(student arr[], char *name, int math, int com, int count); // 성적입력 처리 함수

int search(student arr[], char *name, int count); // 이름을 통해 조회하는 함수

void output(student arr[], int count); // 전체 입력된 값을 출력하는 함수


int main(){

student arr[20];

char name[20];

int count = 0;

int select,math, com,i;


while (1){

printf("선택) 1.성적 추가 2.성적 조회 3.전체 조회 4.종료 : ");

scanf("%d", &select);


if (select == 1){

printf("이름, 수학 성적, 컴퓨터 성적 : ");

scanf("%s %d %d", name, &math, &com);

insert(arr, name, math, com, count);

count++;

}

else if (select == 2){

printf("이름 : ");

scanf("%s", name, &math, &com);

i = search(arr, name, count);

if (i != -1)

printf("%s %d %d \n", arr[i].name, arr[i].math, arr[i].com);

else

printf("%s 찾지못함 \n", name);

}

else if (select == 3){

output(arr, count);

}

else if (select == 4){

printf("종료합니다. \n");

break;

}

else{

printf("선택 오류 \n");

}

}// close while()


return 0;

}


void insert(student arr[], char *name, int math, int com, int count){

strcpy(arr[count].name, name);

arr[count].math = math;

arr[count].com = com;

}


int search(student arr[], char *name, int count){

int i;

for (i = 0; i < count; i++){

if (!strcmp(arr[i].name, name)) // 문자열 비교함수

return i;

}

return -1;

}


void output(student arr[], int count){

int i;

for (i = 0; i < count; i++)

{

printf("%s %d %d \n", arr[i].name, arr[i].math, arr[i].com);

}

}

----------------------------------------------------------------------------------------

실행 결과는 아래와 같습니다.


* 출처 : 한국기술교육대학교 온라인평생교육원 C 프로그래밍_2 

          스타일 C프로그래밍 저.김종훈,김종진 출.WellBook




'언어 > C' 카테고리의 다른 글

[C] 자기 참조 구조체와 연결리스트  (2) 2017.01.04
[C] 동적 메모리  (0) 2017.01.03
[C] 구조체  (2) 2016.12.26
[C] 배열과 포인터  (3) 2016.12.25
[C] 포인터  (0) 2016.12.23

+ Recent posts