jam 블로그

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

개발 및 관련 자료/C

[C] 22. 구조체와 사용자 정의 자료형1

kid1412 2013. 5. 12. 19:47
728x90
I. 구조체란 무엇인가?
  • 구조체 : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것
  • 구조체의 정의
  1. struct 구조체 이름
  2. {
  3. 멤버변수
  4. };
  •  위와 같은 기본 형식이다.
  • 구조체 변수의 선언
  1. struct 구조체 이름
  2. {
  3. 멤버변수
  4. } p1, p2, p3;
  •  위와 같은 경우 밑의 그림처럼 생성이된다.
  • 구조체의 정의와 구조체 변수의 선언의 분리
  1. struct 구조체 이름
  2. {
  3. 멤버변수
  4. };
  5.  
  6. inr main()
  7. {
  8. struct p1,p2,p3;
  9. ...
  10. return 0;
  11. }
  • 위의 같은 경우도 동시 선언했을때와 같은 형태이다.

 

  • 구조체 변수로의 접근
  1. #include <stdio.h>
    #include <math.h>
  2. struct point
    {
     int x;
     int y;
    };
  3. int main()
    {
     struct point p1, p2;
  4.  double distance;
  5.  fputs("첫 번째 점의 x,y 좌표 입력 : ",stdout);
     scanf("%d %d",&p1.x,&p1.y);
  6.  fputs("두 번째 점의 x,y 좌표 입력 : ",stdout);
     scanf("%d %d",&p2.x,&p2.y);
  7.  distance = sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
  8.  printf("두 점의 거리는 %f입니다.\n",distance);
     return 0;
    }
  • 위의 소스처럼 p1.x p1.y 이런 식으로 접근이 가능하다.

 

  •  구조체 변수의 초기화

    • 배열 초기화 문법을 구조체에 적용하기
  1. struct person
  2. {
  3. char name[20];
  4. char phone[20];
  5. int age;
  6. };
  7. inr main()
  8. {
  9. struct person p = {"kid","123-123",22};
  10. ...
  11. return 0;
  12. }
  • 위와 같은 방법으로 초기화가 가능하다.

    • 구조체 변수 멤버를 지정하여 초기화하기

 

  1. struct person
  2. {
  3. char name[20];
  4. char phone[20];
  5. int age;
  6. };
  7. inr main()
  8. {
  9. struct person p = {.age=22, .name="kid", .phone="123-123"};
  10. ...
  11. return 0;
  12. }
  • 위와 같은 방법으로 멤버를 지정해서 초기화를 할수 있다.

 

II. 구조체와 배열 그리고 포인터

  •  구조체와 배열

    • 구조체 배열의 선언 및 접근
  1. struct person
  2. {
  3. char name[20];
  4. char phone[20];
  5. int age;
  6. };
  7. inr main()
  8. {
  9. struct person pArray[10];
  10. ...
  11. return 0;
  12. }
  • 위의 소스는 구조체를 배열로 선언을 한것이다.
  1. #include <stdio.h>
  2. struct person
    {
     char name[20];
     char phone[20];
    };
    int main()
    {
     struct person pArray[3];
     int i;
     for (i=0;i<3;i++)
     {
      printf("이름, 전화번호 : ");
      scanf("%s %s",pArray[i].name,pArray[i].phone);
     }
     printf("\n 입력 결과는 다음과 같습니다.\n");
     for (i =0;i<3;i++)
     {
      printf("이름 : %s, 전화번호 : %s\n",pArray[i].name, pArray[i].phone);
     }
     return 0;
    }
  •  위의 소스를 보면 구조체를 배열로 받아서 그 배열에 저장하고 출력하는 소스이다.

     

     

  • 구조체 배열의 초기화
  1. struct person
  2. {
  3. char name[20];
  4. char phone[20];
  5. int age;
  6. };
  7. inr main()
  8. {
  9. struct person pArray[3]={
  10. {"a","111"},
  11. {"b","222"},
  12. {"c","333"}
  13. };
  14. ...
  15. return 0;
  16. }
  • 위와 같은 방식으로 앞에서 배운 배열에서 초기화 하듯이 하면 된다.

 

  • 구조체와 포인터

    • 구조체 포인터를 선언하여 구조체 변수를 가리키는 경우
    • 구조체의 멤버로 포인터 변수를 선언되는 경우
  • 구조체 변수와 포인터  
  1.  #include <stdio.h>
  2. struct person
    {
     char name[20];
     char phone[20];
    };
    int main()
    {
     struct person man = {"kid","123"};
     struct person* pMan;
     pMan = &man;
  3.  printf("name : %s\n",man.name);
     printf("phone : %s\n",man.phone);
  4.  printf("name : %s\n",(*pMan).name);
     printf("phone : %s\n",(*pMan).phone);
  5.  printf("name : %s\n",pMan->name);
     printf("phone : %s\n",pMan->phone);
     return 0;
    }
  • pMan은 man의 주소값을 가지고 있다. 따라서 pMan 대신 &man을 넣어도 된다.

    • *pMan.name == *(pMan.name)
    • (*pMan).name == pMan->name

 

  • 포인터 변수의 구조체 멤버
  1. #include <stdio.h>
  2. struct perInfo
    {
     char add[30];
     char tel[30];
    };
    struct person
    {
     char name[20];
     char pID[20];
     struct perInfo* info;
    };
  3. int main()
    {
     struct perInfo info = {"Korea Seoul","333-444"};
     struct person man = {"Mr. Lee","123345-12341234"};
     man.info = &info;
  4.  printf("name  : %s\n",man.name);
     printf("pID : %s\n",man.pID);
     printf("addr : %s\n",man.info->add);
     printf("tel : %s\n",man.info->tel);
  5.  return 0;
    }
  •  위의 소스의 결과값을 보고 어떻게 돌아가는지만 알면 된다.
  1. #include <stdio.h>
  2. struct person
    {
     char name[20];
     char pID[20];
     struct person* frnd;
    };
  3. int main()
    {
     struct person man1 = {"Korea Seoul","333-444"};
     struct person man2 = {"Mr. Lee","123345-12341234"};
     man1.frnd = &man2;
  4.  printf("[Mr.Lee]\n");
     printf("name : %s\n",man1.name);
     printf("pID : %s\n",man1.pID);
  5.  printf("[His Friend]\n");
  6.  printf("name : %s\n",man1.frnd->name);
     printf("pID : %s\n",man1.frnd->pID);
     return 0;
    }
  •  person이라는 구조체를 정의하는데, 구조체의 멤버로 person 구조체의 포인터 변수가 올 수 있다.

     

  • 구조체 변수의 주소 값과 구조체 변수의 첫 번째 멤버의 주소 값
  1. #include <stdio.h>
  2. struct simple
    {
     int data1;
     int data2;
    };
  3. int main()
    {
     struct simple s = {1,2};
     printf("address1 : %d\n",&s);
     printf("address2 : %d\n",&(s.data1));
     return 0;
    }

- 구조체 변수의 주소값과 구조체 변수의 첫 번째 멤버의 주소 값은 같다. 

Comments