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

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;
     }
    }
  • 위와 같은 소스를 만들 수 있다.

이 글은 스프링노트에서 작성되었습니다.

'2. C/C++ > 01. C' 카테고리의 다른 글

25. 메모리 관리와 동적 할당  (0) 2008.12.07
24. 파일 입.출력  (0) 2008.12.07
22. 구조체와 사용자 정의 자료형1  (0) 2008.12.07
21. 문자와 문자열 처리 함수  (0) 2008.12.07
19. 함수포인터와 void 포인터  (0) 2008.12.07
Posted by kid1412
,