Contents

Develop
2003.04.23 10:57

[c] 구조체의 설명과 예제..

조회 수 8601 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
구조체 : 서로 관련있으면서 다른 이름과 데이타 타입을 갖는 요소들을 모아놓은 것.
다른 프로그래밍 언어에서는 레코드라고도 한다.

구조체의 장점
1. 서로 연관된 데이터들을 묶어서 하나의 단위로 취급할 수 있다. 
2. 구조체 대입 (structure assignment) 이 가능하다.
3. 함수의 parameter 로서 구조체를 통째로 건네줄 수도 있고, 함수의 리턴값으로 구조체를 통째로
     리턴받을 수도 있다.

구조체의 예
다음 문장은 
        struct complex {
            double  real;
            double  imag;
        };
        struct complex  x, y;

아래와 같은 의미이다.

        struct complex {
            double  real;
            double  imag;
        } x, y;


다음은 잘못된 구조체 선언이다.
        struct  S {
           int  a;
           struct  S  next;
        };

다음은 올바른 구조체 선언이다.
        struct  S {
            int  a;
            struct  S  *next;
        };

관련 연산자
멤버 연산자('.')
구조체 안에는 여러 개의 멤버가 있을 수 있다. 그리고, 그 멤버의 종류는 C 의 자료형이면
어느 것이든지 상관없다. 그리고 그러한 멤버들을 참조할 수 있도록 해 주는 연산자가 바로
멤버 연산자이다. 만일 name 이 구조체명이고 member 는 구조 템플릿에 기술된 멤버라면, 

            name.member 

는 구조체의 멤버를 나타낸다. 멤버 연산자는 나중에 배울 유니언에 대해서도 같은 방식으로
사용된다. 다음의 예는 구조체 item 의 멤버 code 에 값을 대입하는 것이다. 

              struct {
                  int code;
                  float cost;
              } item;

              item.code = 1212;


간접 멤버 연산자('->')
이 연산자는 구조체나 유니언의 구성원을 식별하기 위해서 구조체나 유니언에 대한
포인터와 함께 사용된다. ptrstr 이 구조체에 대한 포인터이고, member 가 구조체 템플릿에
기술된 멤버라면, 

            ptrstr->member 

는 포인터가 가리키는 구조체의 구성원임을 나타낸다. 간접 구성원 연산자는 유니언에
대해서도 같은 방식으로 사용된다. 

              struct {
                  int code;
                  float cost;
              } item, *ptrstr;

              ptrstr = &item;
              ptrstr->code = 3434;

이것은 구조체 item 의 구성원 code 에 값을 대입한다. 다음 세 연산식은 모두 동일하다. 
           ptrstr->code      item.code       (*ptrstr).code

예제: simplestruct.c
     1  #include <stdio.h>
     2
     3  struct complex {
     4      int  real;
     5      int  imag;
     6  };
     7
     8  main() {
     9      struct complex a = { 3, 4 }, b, *c;
    10
    11      printf("&a = %p t a.real = %d t a.imag = %dn", &a, a.real, a.imag);
    12      printf("&a.real = %p t &a.imag = %p nn", &a.real, &a.imag);
    13
    14      b = a;
    15      a.real = 5;
    16      a.imag = 6;
    17      printf("&b = %p t b.real = %d t b.imag = %dn", &b, b.real, b.imag);
    18      printf("&b.real = %p t &b.imag = %p nn", &b.real, &b.imag);
    19
    20      c = &a;
    21      a.real = 7;
    22      a.imag = 8;
    23      printf("c = %p t c->real = %d t c->imag = %dn", c, c->real, c->imag);
    24  }

#49 enterprise:/data1/student/c9844000% a.out
&a = effff9e4    a.real = 3      a.imag = 4
&a.real = effff9e4       &a.imag = effff9e8 

&b = effff9dc    b.real = 3      b.imag = 4
&b.real = effff9dc       &b.imag = effff9e0 

c = effff9e4     c->real = 7     c->imag = 8


중첩된 struct

struct S {
        struct T { int a, b; } x;
};
struct S a;
a.x.a = 10;
a.x.b = 20;

예제: nestedstruct.c
     1  #include <stdio.h>
     2
     3  main() {
     4      struct  S {
     5          struct  T {
     6              int a;
     7              int b;
     8          } x;
     9          int  y;
    10      };
    11
    12      struct S a = { { 10, 20}, 30 };
    13
    14      printf("a.x.a = %dn", a.x.a);
    15      printf("a.x.b = %dn", a.x.b);
    16      printf("a.y = %dn", a.y);
    17  }

#5 enterprise:/data1/student/c9844000% a.out
a.x.a = 10
a.x.b = 20
a.y = 30


struct의 각 컴포넌트의 포인터
struct vector3 {
        int x;
        int y;
        int z;
} s;
int  *p, *q, *r;
....
p = &s.x;
q = &s.y;
r = &s.z;

구조체와 함수
예제: passing_struct.c
     1  #include <stdio.h>
     2
     3  struct da {
     4      int x,y,z;
     5  };
     6
     7  int total ( struct da tot ) {
     8      return ( tot.x + tot.y + tot.z );
     9  }
    10
    11  main() {
    12      struct da val = { 10, 30, 50 };
    13      int sum = 0;
    14      sum = total ( val );
    15      printf("Sum = %dn",sum);
    16  }

#62 enterprise:/data1/student/c9844000% a.out
Sum = 90

예제: passing_pointer.c
     1  #include <stdio.h>
     2
     3  struct da {
     4      int x, y, z;
     5  };
     6
     7  int total ( struct da *tot) {
     8      return ( tot->x + tot->y + tot->z );
     9  }
    10
    11  void main(void) {
    12      struct da val = { 10, 30, 50 };
    13      int sum = 0;
    14      sum = total (&val);
    15      printf("Sum = %dn",sum);
    16  }

#65 enterprise:/data1/student/c9844000% a.out
Sum = 90


구조체 크기
예제: struct_size1.c
     1  #include <stdio.h>
     2
     3  main() {
     4      struct  S {
     5          char  c1;
     6          char  c2;
     7      };
     8
     9      struct S a;
    10
    11      printf("sizeof(S) = %dn", sizeof(a));
    12  }
#89 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 2

예제: struct_size2.c
     1  #include <stdio.h>
     2
     3  main() {
     4      struct  S {
     5          char  c1;
     6          char  c2;
     7          int   a;
     8      };
     9
    10      struct S a;
    11
    12      printf("sizeof(S) = %dn", sizeof(a));
    13      printf("&a.c1 = %p n", &a.c1);
    14      printf("&a.c2 = %p n", &a.c2);
    15      printf("&a.a = %p n", &a.a);
    16  }
#95 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 8
&a.c1 = effff9e4 
&a.c2 = effff9e5 
&a.a = effff9e8 


예제: struct_size.c
     1  #include <stdio.h>
     2
     3  main() {
     4      struct  S {
     5          char  c1;
     6          char  c2;
     7          int   value[5];
     8      };
     9
    10      struct S a;
    11
    12      printf("sizeof(S) = %dn", sizeof(a));
    13  }

#71 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 24


student.c
     1  #include <stdio.h>
     2
     3  struct student {
     4      char name[20];
     5      int  age;
     6      int  year;
     7      struct student * next;
     8  };
     9
    10  main() {
    11      struct student a, *p, *i;
    12
    13      strcpy(a.name, "Hong Gil Dong");
    14      a.age = 22;
    15      a.year = 1;
    16      a.next = NULL;
    17
    18      p = (struct student *) malloc(sizeof(struct student));
    19      strcpy(p->name, "Lee Soong Sil");
    20      p->age = 22;
    21      p->year = 1;
    22      p->next = NULL;
    23
    24      a.next = p;
    25      i = &a;
    26
    27      while(i != NULL) {
    28          printf("i->name :%sn", i->name);
    29          printf("i->age :%dn", i->age);
    30          printf("i->year :%dn", i->year);
    31          i = i->next;
    32          printf("n");
    33      }
    34  }

#33 enterprise:/data1/student/c9844000% a.out
i->name :Hong Gil Dong
i->age :22
i->year :1

i->name :Lee Soong Sil
i->age :22
i->year :1


예제: dynamic_student.c
     1  #include <stdio.h>
     2
     3  struct student {
     4      char name[50];
     5      int  age;
     6      int  year;
     7      struct student * next;
     8  };
     9
    10  main() {
    11      struct student *p, *head, *temp;
    12      char name[50], end;
    13      int  age, year;
    14
    15      head = p = temp = NULL;
    16      while(1) {
    17          printf("put name:");
    18          gets(name);
    19          printf("put age:");
    20          scanf("%d", &age);
    21          printf("put year:");
    22          scanf("%d", &year);
    23          temp = (struct student *) malloc(sizeof(struct student));
    24          if(head == NULL) {
    25              head = temp;
    26              p = temp;
    27          } else {
    28              p->next = temp;
    29          }
    30          strcpy(temp->name, name);
    31          temp->age = age;
    32          temp->year = year;
    33          temp->next = NULL;
    34
    35          getchar();
    36          printf("Do you want more data ? (Y/N):");
    37          end = getchar();
    38
    39          if(end == 'N' || end == 'n')
    40              break;
    41      }
    42
    43      temp = head;
    44      printf("nn=====================================n");
    45      while(temp) {
    46          printf("temp->name :%sn", temp->name);
    47          printf("temp->age :%dn", temp->age);
    48          printf("temp->year :%dn", temp->year);
    49          temp = temp->next;
    50          printf("n");
    51      }
    52  }

#165 enterprise:/data1/student/c9844000% a.out
put name:Son Oh Gong
put age:22
put year:1
Do you want more data ? (Y/N):
put name:Sa Oh Jung
put age:21
put year:1
Do you want more data ? (Y/N):n


=====================================
temp->name :Son Oh Gong
temp->age :22
temp->year :1

temp->name :Sa Oh Jung
temp->age :21
temp->year :1


공용체(UNION)

union  name {
        type  name;
        type  name;
};

     1  #include <stdio.h>
     2  #define AGE  1
     3  #define YEAR 2
     4
     5  union Information {
     6      int  age;
     7      int  year;
     8  };
     9
    10  struct  student {
    11      char name[20];
    12      int infortype;
    13      union Information value;
    14      struct student * next;
    15  };
    16
    17  main() {
    18      struct student lee, *p, *i;
    19
    20      lee.infortype = AGE;
    21      strcpy(lee.name, "Lee Soong Sil");
    22      lee.value.age = 22;
    23      lee.next = NULL;
    24
    25      p = (struct student *)malloc(sizeof(struct student));
    26      strcpy(p->name, "Hong Gil Dong");
    27      p->infortype = AGE;
    28      p->value.age = 22;
    29      p->next = NULL;
    30      lee.next = p;
    31      i = p;
    32
    33      p = (struct student *)malloc(sizeof(struct student));
    34      p->infortype = YEAR;
    35      strcpy(p->name, "Sa Oh Jung");
    36      p->value.year = 1;
    37      p->next = NULL;
    38      i->next = p;
    39
    40      i = &lee;
    41      while(i) {
    42          printf("i->name : %sn", i->name);
    43          if(i->infortype == AGE)
    44              printf("i->value(age) : %dn", i->value.age);
    45          else if(i->infortype == YEAR)
    46              printf("i->value(year) : %dn", i->value.year);
    47          else
    48              printf("Invalid data typen");
    49
    50          printf("n");
    51          i = i->next;
    52      }
    53  }

#53 enterprise:/data1/student/c9844000% a.out
i->name : Lee Soong Sil
i->value(age) : 22

i->name : Hong Gil Dong
i->value(age) : 22

i->name : Sa Oh Jung
i->value(year) : 1


?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
181 Develop [c] fgets() 함수 사용하기.. hooni 2003.04.23 8057
180 Develop [c] 싱글, 더블 링크리스트(linked list)로 만든 예제.. file hooni 2003.04.23 6994
179 Develop [c] 컴파일러 선행처리기 따라하기.. file hooni 2003.04.23 6890
178 Develop [c] 구조체/파일 입출력 프로그램 file hooni 2003.04.23 7291
177 Develop [c++] 더블 링크리스트(linked list) 학습용 초간단 단어장 file hooni 2003.04.23 9563
176 Develop [c] OpenGL 직사각형(2D) 크기 확대/축소 hooni 2003.04.23 9266
175 Develop [jsp] 정적/동적(차트생성) 이미지 전달 file hooni 2003.04.23 7506
174 Develop [c] 프로세스간의 통신(파이프) hooni 2003.04.23 7068
» Develop [c] 구조체의 설명과 예제.. hooni 2003.04.23 8601
172 Develop [c] 포인터와 함수포인터에 대해.. hooni 2003.04.23 8213
171 Develop [c] 스토리지 클래스(변수) hooni 2003.04.23 8411
170 Develop [c] 시간 관련 함수 설명과 예제.. file hooni 2003.04.23 11740
Board Pagination Prev 1 ... 79 80 81 82 83 84 85 86 87 88 ... 99 Next
/ 99