노는게 제일 좋습니다.

17회차 : 구조체 정의, 구조체 멤버 참조 본문

C

17회차 : 구조체 정의, 구조체 멤버 참조

노는게 제일 좋습니다. 2017. 3. 2. 21:29

0. 참고 자료

http://soen.kr/

구조체 패딩 http://pangate.com/19


1. 구조체의 정의

여러 변수들을 하나로 묶어둔 것.

struct {

   char a[10];

   int b;

   int c[5];

} studioplug;

위와 같이 a,b,c를 멤버로 가지는 studioplug라는 이름의 구조체를 정의할 수 있다.

구조체 안에 들어있는 변수를 멤버라고 한다. 구조체도 멤버가 될 수 있다. (ㄷㄷ)


studioplug.b=10;

stucioplug.c[2]=100;

멤버에 접근하고 싶으면 위와 같이 한다. 구조체 이름 뒤에 점(.)을 붙이고, 멤버를 적는다.


2. 구조체의 태그

1번항목의 studioplug와 같은 구조체가 단 하나만 필요하다면, 이미 본 예제처럼 바로 정의를 해버려도 된다.

하지만 동일한 모양의 구조체가 여러개 필요하다면, 태그를 사용할 수 있다.

struct studioplug{

   char a[10];

   int b;

};

위와 같은 코드를 두고 구조체 태그를 선언했다고 표현한다.


struct studioplug first;

태그를 선언한 다음에는 태그를 이용해 위와 같이 구조체를 정의할 수 있다.


strcpy_s(first.a,5,"abcd");

다음과 같이 멤버에 접근할 수 있다.


3. 구조체 포인터

 struct plug {
  char a;
  int b;
 };

 struct plug g;
 struct plug *gp;
 gp=&g;

 (*gp).a = 'a';
 gp->b = 5;
 printf("%c %c %c\n", g.a, (*gp).a, gp->a);
 printf("%d %d %d\n", g.b, (*gp).b, gp->b);

위의 코드는 구조체의 포인터를 만들고, 이를 이용해 멤버의 값을 출력하는 동작을 한다.

struct plug *gp와 같이 포인터를 만들 수 있고, (*gp).a 또는 gp->a와 같이 멤버에 접근할 수 있다.

->는 멤버 액세스 연산자라고 한다. 좌변에 구조체 포인터, 우변에 멤버이름이 온다.


4. 구조체 배열

 struct plug {
  char a;
  int b;
 };

struct plug strArray[10];

와 같이 코드를 적으면 plug구조체를 원소로 하는 strArray배열이 만들어진다.

strArray[0].a='g'; 나, strArray[5].b=53; 같이 멤버에 접근할 수 있다.


struct plug *strPtr[10];

for(int i=0;i<10;i++){

  strPtr[i]=(struct plug *)malloc(sizeof(struct plug));

}

strPtr[5]->b=53;

위와 같이 구조체 포인터를 하나 두고, 동적할당을 해줄 수도 있다.


5. 중첩 구조체

구조체 멤버로 구조체가 올 수도 있다. 단, 자기중첩이나 상호중첩은 안된다.


struct a{

  struct a *b;

};

그러나 구조체 멤버로 자신의 구조체포인터를 가질 수는 있다. 이를 자기 참조 구조체 라고 한다.


struct b{

  int apple;

  int banana;

};

struct a{

  struct b bb;

};

struct a plug;

plug.bb.apple=53;

plug.bb.banana=5353;

위 코드는 구조체 b가 구조체a의 멤버변수인 경우이다. 이 상황에서 a속 bb의 멤버변수에 접근하는 예를 보여준다.

Comments