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