jam 블로그

[C] 23. 구조체와 사용자 정의 자료형2 본문

개발 및 관련 자료/C

[C] 23. 구조체와 사용자 정의 자료형2

kid1412 2013. 5. 12. 19:48
728x90

I. 구조체 변수의 전달과 리턴

  • 함수의 인자로 전달되는 구조체 변수
  1. #include <stdio.h>
  2. struct simple
    {
     int data1;
     int data2;
    };
  3. void show(struct simple ts);
    void swap(struct simple* ps);
  4. int main()
    {
     struct simple s={1,2};
  5.  show(s);
     swap(&s);
     show(s);
     return 0;
    }
  6. void show(struct simple ts)
    {
     printf("data1 : %d,data2 : %d\n",ts.data1,ts.data2);
  7. }
    void swap(struct simple* ps)
    {
     int temp;
     temp = ps->data1;
     ps->data1=ps->data2;
     ps->data2 = temp;
    }
  •  show 함수에서는 변수 s가 지니고 있는 값을 매개 변수 ts에 복사하게 된다.

    • 따라서 매개변수 이자 show 함수의 지역 변수인 ts는 main 함수 내에 존재하는 변수 s와 같은 값을 지니게 된다.
  • swap 함수는 구조체 변수의 포인터를 인자로 전달 받는다. 그리고 전달받은 구조체 변수의 변수의 멤버 값을 서로 바꿔주고 있다.

 

  • 구조체 변수의 연산
  1. #include <stdio.h>
  2. struct simple
    {
     int data1;
     int data2;
    };
  3. void show(struct simple ts);
  4. int main()
    {
     struct simple s1={1,2};
     struct simple s2;
  5.  s2=s1;
     show(s2);
     return 0;
    }
  6. void show(struct simple ts)
    {
     printf("data1 : %d,data2:%d\n",ts.data1,ts.data2);
    }
  •  가장 대표적으로 허용되는 연산은 대입 연산이다.

    • 대입연산 이외에 sizeof 연산이나 포인터와 관련된 연산은 가능하다.

 

  • 구조체 변수의 리턴
  1. #include <stdio.h>
  2. struct simple
    {
     int data1;
     int data2;
    };
  3. void show(struct simple ts);
    struct simple getdata(void);
  4. int main()
    {
     struct simple s =getdata();
     show(s);
  5.  return 0;
    }
  6. void show(struct simple ts)
    {
     printf("data1 : %d,data2 : %d",ts.data1,ts.data2);
    }
  7. struct simple getdata(void)
    {
     struct simple temp;
     scanf("%d %d",&temp.data1,&temp.data2);
     return temp;
    }
  •  getdata에서 temp를 선언해서 입력을 받은 후에 temp를 리턴하는 방법이다.

    • 구조체 변수가 함수의 인자로 전달과 대입이 가능하고, 함수 내에서 리턴도 가능하다.

 

II. 구조체의 유용함에 대한 두가지 이야기

  • 책을 참고하세요.

 

III. 구조체를 포함하는 구조체

  • 구조체가 구조체를 포함한다는 의미는?
  1. #include <stdio.h>
  2. struct point
    {
     int x;
     int y;
    };
  3. struct circle
    {
     struct point p;
     double radius;
    };
  4. int main()
    {
     struct circle c1 = {10,10,1.5};
     struct circle c2 = {{30,30},2.4};
  5.  printf("[circle]\n");
     printf("x : %d,y : %d\n",c1.p.x,c1.p.y);
     printf("radius : %f\n",c1.radius);
     printf("[circle2]\n");
     printf("x : %d,y : %d\n",c2.p.x,c2.p.y);
     printf("radius : %f\n",c2.radius);
  6.  return 0;
    }
  • 구조체 안에 구조체가 있다고 생각하면 된다.

 

  •  중첩된 구조체 변수의 초기화

    • case 1 : struct circle c1 = {10,10,1.5};

      • 위와 같은 경우 struct circle c1 = {10,11}; 이럴 경우 x와 y에 10과 11이 들어가고 radius는 0.0 이 들어간다.
    • case 2 : struct circle c2 = {{30,30},2.4};

      • 위와 같은 경우 struct circle c2 = {{1},2}; 이럴 경우 x에는 1이 y에는 0 radius는 2가 들어간다.

 

IV. 새로운 자료형의 완성

  • typedef란 키워드는 무엇인가?

    • 이미 존재하는 자료형에 새로운 이름을 붙이기 위한 용도로 사용된다.

      • typedef int INT : int형에 INT라는 이름을 붙여 준다는 뜻이다.
  1.  #include <stdio.h>
  2. typedef int INT;
    typedef int* P_INT;
  3. typedef unsigned int UINT;
    typedef unsigned int* P_UINT;
  4. typedef unsigned char UCHAR;
    typedef unsigned char* P_UCHAR;
  5. int main()
    {
     INT a = 10;
     P_INT pA = &a;
  6.  UINT b = 100;
     P_UINT pB = &b;
     
     UCHAR c = 'a';
     P_UCHAR pC = &c;
  7.  printf("%d, %d, %c\n",*pA,*pB,*pC);
     return 0;
    }
  8. 이런식으로 사용한다.
  •  typdef와 구조체 변수의 선언

    • 구조체 정의와 분리된 typedef 선언
  1.  #include <stdio.h>
  2. struct Data
    {
     int data1;
     int data2;
    };

  3. typedef struct Data Data;
    int main()
    {
     Data d={1,2};
     printf("%d %d",d.data1,d.data2);
     return 0;
    }
  • 위와 같은 식으로 struct Data를 Data로 이름을 선언해서 메인에서 struct Data d라고 안하고 Data d 라고 하였다.

 

  • 구조체 정의와 typedef 선언 동시에 하기
  1. struct Data
    {
     int data1;
     int data2;
    };
    typedef struct Data Data;
  2. typedef struct Data
    {
     int data1;
     int data2;
    }Data;
  • 두개의 struct를 보면 같은 것이다.
  • 구조체의 이름도 생략이 가능하다
  1. typedef struct Data
    {
     int data1;
     int data2;
    }Data;
  2. typedef struct
    {
     int data1;
     int data2;
    }Data;
  • 위의 두개의 구조체는 완전히 같은 선언은 아니다.
  1. #include <stdio.h>
  2. typedef struct Dog
    {
     int data1;
     int data2;
    }Dog;

  3. typedef struct
    {
     int data1;
     int data2;
    }Cat;
  4. int main()
    {
     Dog d1;
     struct Dog d2;
  5.  Cat c1;
     struct Cat c2;
     return 0;
    };
  •  Dog 구조체는 typedef에 의한 선언이나 이전 형식도 가능하나 Cat은 구조체의 이름이 없기 때문에 typedef에 의한 선언은 가능하나 이전 형식은 안된다

 

V. 공용체

  • 공용체

    • 서로 다른 자료형의 변수를 하나의 메모리 공간에서 공유하는 경우에 사용한다.
    • 22.jpg
    • 위와 같이 메모리를 공유하는 식이다.
    • 멤버 중 가장 메모리를 많이 요구 하는 멤버에 초점을 둬서 메모리를 할당한다.
  1.  #include <stdio.h>
    union u_data
    {
     int d1;
     double d2;
     char d3;
    };
  2. int main()
    {
     union u_data data;
  3.  data.d2 = 3.3;
  4.  printf("%d, %f, %c\n",data.d1,data.d2,data.d3);
  5.  data.d1 = 2;
     printf("%d, %f, %c\n",data.d1,data.d2,data.d3);
  6.  data.d3 = 'a';
     printf("%d, %f, %c\n",data.d1,data.d2,data.d3);
    return 0;
    }
  •   단지 이렇게 작동한다는 것만 알아두면 된다.

 

VI. 열거형

  • 열거형의 정의와 그 의미

    • enum color{RED = 1, GREEN = 3,BLUE=5};

      • 위와 같은 식으로 만들며 color라는 이름의 자료형을 정의하고 그 안에 이름의 상수를 정한다.

        • 이름에 상수를 안정해 주면 처음은 항상 0이다.

 

  • 열거형을 사용하는 이유
  1. #include <stdio.h>
  2. enum days{MON,TUE,WED,THU,FRI,SAT,SUN};
  3. int main()
    {
     int day;
     printf("Input a day(0:monday~6:sunday) : ");
     scanf("%d",&day);
  4.  switch(day)
     {
     case MON:
      printf("월\n");
      break;
     case TUE:
      printf("화\n");
      break;
     case WED:
      printf("수\n");
      break;
     case THU:
      printf("목\n");
      break;
     case FRI:
      printf("금\n");
      break;
     case SAT:
      printf("토\n");
      break;
     case SUN:
      printf("일\n");
      break;
     }
    }
  • 위와 같은 소스를 만들 수 있다.
Comments