2011년6월23일_구조체(struct), 구조체배열, 구조체포인터

 

 

구조체의 원형, 선언, 정의(typedef)

 

구조체의 원형과 선언을 따로 하는 방법…

   1:  //구조체의 원형
   2:  struct suman {            //예약어, 태그
   3:      char think[20];        //멤버 또는 필드라 부름.
   4:      int heal;
   5:      int condition;
   6:  };
   7:   
   8:   
   9:  //구조체의 선언
  10:  struct suman bread1;    //bread의 자료형은 구조체 suman
  11:  struct suman b1, b2, b3, *bap;    //여러개 선언가능. bap은 구조체를 가리키는 포인터 변수

 

구조체의 원형과 선언을 한꺼번에 해결하나 하나의 변수만 사용가능.

   1:  //구조체의 원형과 선언을 동시에 하기. 단 하나의 변수 선언시에만 가능.
   2:  struct suman {            //예약어, 태그
   3:      char think[20];        //멤버 또는 필드라 부름.
   4:      int heal;
   5:      int condition;
   6:  } bread1;                //변수명
   7:   
   8:  //또는 태그를 생략하고 선언가능.
   9:  struct {                //예약어
  10:      char think[20];        //멤버 또는 필드라 부름.
  11:      int heal;
  12:      int condition;
  13:  } bread1;                //변수명




typedef을 이용해 SUMAN을 구조체 타입으로 정의…
많이 쓰인다고 하니 앞으로 이 방식대로 코딩하자.

   1:  // typedef을 이용한 구조체정의 (많이 쓰이는 방식)
   2:  typedef struct sm_tag {
   3:      char think[20];        //멤버 또는 필드라 부름.
   4:      int heal;
   5:      int condition;
   6:  } SUMAN;                //자료형으로 정의됨.
   7:   
   8:  // 태그생략
   9:  typedef struct {
  10:      char think[20];        //멤버 또는 필드라 부름.
  11:      int heal;
  12:      int condition;
  13:  } SUMAN;                //자료형으로 정의됨.





구조체배열


   1:  // 태그생략
   2:  typedef struct {
   3:      char think[20];        //멤버 또는 필드라 부름.
   4:      int heal;
   5:      int condition;
   6:  } SUMAN;                //자료형으로 정의됨.
   7:   
   8:   
   9:  SUMAN bread[5];            //구조체배열의 선언
  10:   
  11:  //구조체배열의 각 원소들은 bread[4]부터 시작하여 순서대로 stack영역에 쌓인다.
  12:  bread[0].think[], bread[0].heal, bread[0].condition        //구조체배열의 첫 번째 원소들
  13:  bread[1].think[], bread[1].heal, bread[1].condition        //구조체배열의 두 번째 원소들
  14:  bread[2].think[], bread[2].heal, bread[2].condition        //구조체배열의 세 번째 원소들
  15:  bread[3].think[], bread[3].heal, bread[3].condition        //구조체배열의 네 번째 원소들
  16:  bread[4].think[], bread[4].heal, bread[4].condition        //구조체배열의 다섯 번째 원소들


image

구조체배열은 배열과 같이 stack의 위에서 부터(주소가 낮음) 연속적으로 배치된다.
일반변수는 이와 다르게 밑에서 부터(주소가 높음) 쌓인다.

 

 

 

구조체를 가리키는 포인터


아직 잘 몰라서 사용하기 꺼려진다.

<핵심코드(?)>

   1:  //구조체포인터
   2:  typedef struct {
   3:      char think[20];        //멤버 또는 필드라 부름.
   4:      int heal;
   5:      int condition;
   6:  } SUMAN;                //자료형으로 정의됨.
   7:   
   8:   
   9:  int iNum;
  10:  SUMAN bread, *sp;                //구조체를 가리키는 포인터
  11:   
  12:  //주소넘겨주기
  13:  sp = &bread;
  14:   
  15:  //엑세스법
  16:  sp->heal = 60;            //(*sp).heal = 60;  과 같이 heal에 60을 대입.
  17:  iNum = sp->heal;        //iNum = (*sp).heal;과 같이 heal의 값을 읽어와 iNum에 대입. 
  18:   
  19:   

 

<예제코드>

   1:  #include <stdio.h>
   2:   
   3:  typedef struct {
   4:      char name[20];
   5:      int heal;
   6:      int condition;
   7:  } SUMAN;
   8:   
   9:  int main()
  10:  {
  11:      int iNum;
  12:      SUMAN bread, *sp;
  13:   
  14:      sp = &bread;
  15:      
  16:      iNum = 100;
  17:      sp->heal = 60;    
  18:      printf("%d\n", sp->heal);
  19:   
  20:      sp->heal = iNum;
  21:      printf("%d\n", sp->heal);
  22:   
  23:      return 0;
  24:  }




 

 

참조(Reference)

 

DSCN3479 DSCN3478