블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    - 구조체

    ⇒ 의미상으로 연관된 여러 데이터를 하나의 이름으로 묶은 사용자 정의 자료형으로, 여러 가지 속성을 가지고 있는 개체를 정의할 수 있다.

    ⇒ typedef 문

     → 예약어 typedef은 새로운 자료형을 정의하는 데 사용된다.

     → 긴 이름의 자료형을 짧게 정의하는 데 편리하게 이용되며, 구조체의 선언에서 유용하게 사용된다.


    // typedef으로 정의한 자료형을 이용하여 프로그램을 작성하는 예

    #include<stdio.h>

    typedef char NAME[20]; // 새로운 자료형 NAME의 정의

    typedef int AGE; // 새로운 자료형 AGE의 정의


    int main()

    {

            NAME student; // student의 자료형은 NAME이다.

            AGE stAge; // stAge의 자료형은 AGE이다.


            puts("Enter Name: ");

            gets(student);

            puts("Enter Age: ");

            scanf("%d", &stAge);

            printf("%s   %d\n",student,stAge);


            return 0;

    }

    ⇒ 출력결과

            

     

    ⇒ gets 는 해킹에 취약하다.

    ⇒ sizeof(student)를 해보면 크기가 20이다. 왜냐하면 char 형의 배열로 [20]만큼의 공간이 확보되어 있으므로.

    ⇒ 위 프로그램에서 gets에 20글자 이상을 넣으면 세그멘테이션 오류가 발생한다. 이것은 해킹의 주요한 원인이 된다. 그렇기에 gcc 컴파일러가 the 'gets' function is dangerous and should not be used.는 경고 메시지를 띄운다.

            

     



    - 구조체의 정의

    ⇒ 배열과 함께 데이터베이스를 구축하는 데 이용되기도 하고, 연결리스트의 노드를 만드는 데 사용되기도 한다.

    ⇒ 배열은 의미상으로 서로 연관된 동일한 자료형을 가진 자료들을 하나의 이름으로 묶어서 다루기 편리하게 만든 자료형. 구조체는 서로 연관이 되지만 자료형이 다른 자료들을 하나의 이름으로 묶은 것.

    ⇒ 구조체와 배열은 서로 중첩되게 정의할 수 있다. 그래서 복잡한 구조의 자료를 효율적으로 구성할 수 있다.

    ⇒ 구조체의 원형(template)을 정의하고, 변수를 선언하는 방법.

     → struct student

        {

            char name[20];

            int phone_number[14];

            int age;

        };

     → 위의 예는 구조체의 구성요소를 정의하는 것으로 메모리의 할당과는 무관하다.

     → 정의는 먼저 struct라는 예약어로 시작한다. 그 뒤의 student는 태그(tag)라고 부르는 구조체 템플릿의 이름이다.

     → 태그 다음에는 구조체의 구성요소가 중괄호에 둘러싸여 정의되고, 마지막으로 세미콜론으로 끝난다. 중괄호에 둘러싸인 각 구성요소는 멤버 혹은 필드라고 부른다.

     → 각 멤버의 정의는 자료형과 이름으로 구성되고, 세미콜론으로 긑난다. 위의 정의에서는 세 개의 멤버가 정의되었고, 첫 번째 멤버 name은 20개의 원소를 가지는 문자배열로 정의되었다. 이것은 구조체 내에 배열이 구조체의 한 멤버로 이용된 경우이다.

     → 두 번째와 세 번째 멤버는 english 와 math로 int 형으로 정의 되었다. 구조체 정의의 맨 끝에 세미콜론을 찍는 것에 유의해야 한다.


     → struct student st1;    // 변수의 선언

            

     

    st1

    name[20]

    20 바이트

    english

    4 바이트

    math

    4 바이트

     → 여러개의 변수를 선언할 때는 다음과 같이 선언한다.

     → struct student st1, st2, s3, *st; // 여기서 st는 구조체를 가리키는 포인트 변수.

     



    #include<stdio.h>


    typedef struct student // typedef을 이용하여 구조체 정의

    {

            char name[20];

            int english;

            int math;

    }STUDENT;


    int main()

    {

            struct student kim; // 변수의 선언

            STUDENT kang; // typedef를 이용해 선언한 구조체 변수의 선언

            STUDENT *P;

            P = &kim;

            kim.math = 100; // 구조체 변수.멤버이름

            kang.math=90;

            printf("kim_math : %d\n", kim.math);

            printf("kang_math : %d\n", kang.math);

            printf("kim_math : %d\n",P->math);

                    

            return 0;

    }

    ⇒ 실행결과

            

     

    ※ 아래의 두 가지는 같은 의미.

    ⇒ typedef struct student

       {

            char Name [20];

       }STUDENT;

     → ① typedef ② struct student{ ~ } ③ STUDENT ④ ;

    ⇒ typedef unsigned int unit;

     → ① typedef ② unsigned int ③ unit ④ ;


    ⇒ 포인터를 사용할 때 P->math로 입력한다. (도트연산자(.) 대신 ->를 사용.)


    #include<stdio.h>

    //#pragma pack(1)


    typedef struct link

    {

            int iNum;

            struct link *next;

    }LINK;

            

    int main()

    {

            LINK one = {1,0};

            LINK two = {2,0};

            LINK three = {3,0};

            LINK *P = &one;

            one.next = &two;

            two.next = &three;


            while(0!=P)

            {

                    printf("%d -> ", P-> iNum);

                    P = P->next;

            }

            printf("NULL\n");

    }


    ⇒ 출력결과         

     ⇒ *P가 one을 가리키고 one은 다시 two를 그리고 two는 다시 three를 가리킨다. 이것이 연결리스트(Linked list)이다.



    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함