기초/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;
}