공용체


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

 공용체의 사용은 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

 자료형에는 기본 자료형과 유도자료형이 있습니다. 기본 자료형은 초반에 공부했던 정수형, 부동소수형, 문자형등이 있고, 유도 자료형은 기본 자료형을 응용해서 보다 복잡한 자료 구현하는 자료형으로 앞에서 공부한 배열, 포인터 그리고 구조체와 공용체가 있습니다.


구조체

 구조체란 여러 종류의 변수를 하나로 묶어서 사용하는 데이터 타입으로 사용자가 직접 정의하는 사용자 정의 타입중 하나입니다. 앞에서 공부했던 함수처럼 메인함수 위쪽에 정의해야 메인함수 등 코드의 아래쪽에서 사용할 수 있습니다. 구조체의 정의와 사용은 아래와 같습니다.

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

// 구조체 정의

struct test{

int age;

char *name;

char *hobby;

}; // 세미콜론을 꼭 붙여줘야합니다.


// 구조체 필드에 접근

struct [구조체 이름] [구조체 변수이름];

struct test p1;

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

p1.name;

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


 구조체 변수를  포인터로도 사용할 수 있습니다. 이때, 구조체 필드에 접근은 어떻게 표현할까요?

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

struct test{

int age;

char *name;

char *hobby;

};

struct test *p1;

(*p1).age; // 이렇게 표현이 가능하지만 

p1->age; // 이렇게 화살표로도 표현이 가능합니다.

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


 이름, 국어, 수학 성적을 입력받아 평균까지 출력하는 코드를 작성해 봤습니다. 사실 간단하게 작성할 수 있는 내용이지만, 구조체를 이용했습니다. 이름, 국어, 수학 성적을 입력을 받고 평균을 계산해서 구조체에 넘겨준뒤에, 구조체를 매개변수로 하는 함수를 이용해 출력을 했습니다.

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

#include <stdio.h>

#include <string.h>

#pragma warning(disable:4996)


struct student{

char name[5];

int korean;

int math;

double average;

};


void out(struct student a); // 구조체를 매개변수로 하는 함수 정의


int main()

{

char input_name[10];

int input_korean;

int input_math;

struct student b;

printf("이름과 성적을 입력하세요.\n");

printf("이름 : ");

scanf("%s", input_name);

printf("국어 : ");

scanf("%d", &input_korean);

printf("수학 : ");

scanf("%d", &input_math);

printf("-----입력 완료-----\n");


strcpy(b.name ,input_name);

b.korean = input_korean;

b.math = input_math;

b.average = (double)(b.korean +b.math) / 2;


out(b); // 함수호출로 출력


return 0;

}


void out(struct student a) 구조체를 매개변수로 하는 함수 구현

{

printf("이름 : %s \n국어 : %d \n수학 : %d \n평균 : %.2lf\n", a.name, a.korean, a.math, a.average);

}

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


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

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




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

[C] 동적 메모리  (0) 2017.01.03
[C] 공용체  (0) 2016.12.27
[C] 배열과 포인터  (3) 2016.12.25
[C] 포인터  (0) 2016.12.23
[C] 배열  (0) 2016.12.23

+ Recent posts