ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C/C++] 구조체
    기초/C,C++ 2017. 3. 6. 10:56

    구조체

    struct

    구조체는 "변수의 묶음"이라고 생각하시면 됩니다.

     

    예를들어 "학생"에대한 국어,영어,수학점수와 그의 대한 총점 평균에 대해서 정의한다고 가정했을 때

     

    void main(){

    char* name;
    int kor;
    int eng;
    int math;
    int sum;
    double avg;

    }

     

    이렇게 정의하신 후 여러개를 정의한다고 했을때 각각의 변수마다 배열로 정의해 주셔야 합니다.

     

     char* name[];
     int kor[];
     int eng[];

    .......

    이러면 너무 귀찮지 않나요?

    이렇게 특정한 대상에 대한 변수들을 한번에 묶어서 사용할 수 있습니다.

     

    [선언]

    struct 구조체이름{

    선언될 변수들..

    ...

    ...

     

    };

    //세미콜론을 붙여준다

     

    메인 함수에서

    struct 구조체이름 구조체변수이름;

    구조체변수이름.선언된변수 ← 접근;

     

    [사용법]

    구조체는 함수들 위에 정의해주시면 됩니다.

     

    키워드 struct

    위에 코드를 구조체로 바꿔준다면

     

    struct student{
         char* name;
         int kor;
         int eng;
         int math;
         int sum;
         double avg;
    };

     

    void main(){
          struct student st;
     

    st.name = "";

    st.kor = 100;

    st.eng = 50;

    }

     

    선언을 해주신다음 .으로 접근하시면 됩니다.

    구조체 변수라는 말에 느낌이 오시나요?

     

    #1.변수는 배열로 만들수 있다.

    #2.변수앞에는 자료형이 온다.

    #1.구조체 배열로 만들수 있다.

    #2.구조체앞에는 자료형이 온다.

    내가 선언한 구조체는 메인에서 만들 구조체의 자료형이다.

     

    [#1]

    그럼 구조체를 변수로 만들어 주시면 됩니다.


     struct student st[10];
     st[0].name = "빨간궁뎅이";
     st[1].name = "파란궁뎅이";
     st[2].name = "탱탱한궁뎅이";

     

    접근도 배열처럼 해주시면 되구요.

     

     

    변수면 파라매터로도 넘길 수 있겠네요?

     

     

    너무 ....꼬아 놨네요 ....

    먼저 메인함수에서 구조체에 대한 포인터변수 sPtr를 선언했습니다.

     

    struct student * 형식의 리턴값을 가지는 함수를 만들었습니다.

    (구조체 주소값을 리턴시켜주기위해)

    그다음에 파라매터는 당연히 구조체 주소값을 받았구요.

    그다음에 만들어놓은 함수에서 배열 3번째의 name값을 변경한뒤 주소값을 리턴시켜줬는데요.

    리턴값을 받은 메인함수에서는 역시 잘 출력되는것을 볼 수 있었네요.

     

    [#2]

    구조체 선언과 동시에 이름을 부여할 수도 있습니다.

     

    키워드 : typedef

    typeder old_type new_type

     

    old_type : int,float ... 기존에 정의된 자료형

    new_type : 자료형에 붙일 이름?

     

    따라서 struct student은 자료형이기때문에

    typedef키워드를 붙여서 STUDENT로 바꿔줍니다.

    그럼 모든 소스코드에 STUDENT 자료형을 사용하면 struct student를 사용하실 필요가 없습니다.

    똑같은 결과이지만 더 깔끔해졌네요!!

    (너무... 억지로 만든 함수같네요;;)

     

    [구조체 포인터]

     

    쉽게 설명하기 위해서 그냥 변수와 포인터를 선언했습니다

     

    int type num을 선언해서

    포인터 pnum의 주소값을 num으로 넣어놨습니다.

     

    똑같이

    앞에서 정의한 STUDENT타입의 st를 선언해서

    포인터 pst에 st를 넣었습니다.

     

    변수처럼 (*)를 사용해서 접근합니다.

    또한 구조체안의 변수에 접근을 할때 .을 사용했지만

    *기호와 .을 생략하고

    (->)를 사용해서 접근할 수 도있습니다.

    더 편리하니 포인터를 사용할 때는 -> 사용하는거 기억해두세요. 

     

    [소스]

    #include <stdio.h>
    #include <string.h>

     

    typedef struct student{
     char *name;
     int age;
     char *area;
    }STUDENT;

     

    void main(){
     int num;
     int * pnum = &num;
     
     STUDENT st;
     STUDENT * pst = &st;

     strcpy((*pst).name,"서울우유");
     (*pst).age = 30;

     printf("%s %d\n", (*pst).name,(*pst).age);
     printf("%s %d\n", pst->name,pst->age);
     
     return 0;
    }

     

     

     

    '기초 > C,C++' 카테고리의 다른 글

    [C/C++] #define, 전처리기,  (0) 2017.03.08
    [C/C++] 메모리영역  (0) 2017.03.07
    [C/C++] 클래스, 구조체, 함수의 차이점  (0) 2017.03.03
    [C/C++] 반환 형식 ,Call by ~  (0) 2017.03.02
    [C,C++] 포인터와 배열  (0) 2017.03.02

    댓글

Designed by Tistory.