C 프로그래밍/11. 구조체
11.6 공용체
Recircle
2019. 6. 3. 11:47
공용체
- 같은 메모리 영역을 여러 개의 변수가 공유
- 공용체를 선언하고 사용하는 방법은 구조체와 아주 비슷
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> union example { char c; int i; }; int main() { union example ex; printf("%p\t%p\n", &ex.c, &ex.i); } | cs |
--컴퓨터 마다 주소값은 다르지만 c, i 둘다 같은 주소값이 출력된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <stdio.h> union example { char c; int i; }; int main() { union example v; v.c = 'A'; printf("v.c:%c v.i%d\n", v.c, v.i); v.i = 10000; printf("v.c:%c v.i%d\n", v.c, v.i); } | cs |
- 다른 멤버를 통하여 출력을 하면 메모리의 같은 부분을 다르게 해석한다.
- int형의 멤버 i를 통하여 출력하면 같은 메모리 영역을 int형으로 해석을 하여 출력한다.
실행 결과
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <stdio.h> #include <string.h> #define REG_NUMBER 2 #define STU_NUMBER 1 struct student { int type; // 공용체가 현재 어떤 변수를 사용하는지를 저장 union //주민등록번호나 학번 중에서 하나를 선택한다. { int sut_number; char reg_number[15]; } id; char name[20]; }; void print(struct student s) { switch (s.type) //공용체의 타입에 따라서 적절한 값을 출력한다. { case STU_NUMBER: printf("학번 %d\n", s.id.sut_number); printf("이름 : %s\n", s.name); break; case REG_NUMBER: printf("주민등록번호 : %s\n", s.id.reg_number); printf("이름 : %s\n", s.name); break; default: printf("타입 오류 \n "); break; } } int main() { struct student s1, s2; s1.type = STU_NUMBER; //학번 사용 s1.id.sut_number = 20190001; strcpy(s1.name, "홍길동"); s2.type = REG_NUMBER; strcpy(s2.id.reg_number, "860101-1056076"); // 주민등록번호 사용 strcpy(s2.name, "김철수"); print(s1); print(s2); } | cs |
실행 결과