본문 바로가기

FALL in/G.MA' s C

[C프로그래밍] - 구조체


구조체 정의와 선언

구조체도 배열처럼 여러개의 데이터를 그룹으로 묶어서 하나의 자료형으로 정의하고 사용하는 자료형이다. 

배열과 구조체가 다른점이 있다면, 배열은 같은타입의 데이터만 그룹으로 묶을수있고, 구조체는 다른타입의 데이터도 그룹으로 묶을수 있다는 것이다.

예를 들어, 학생수가 30명인 어떤 반의 학생들의 수학성적을 저장하고 싶다면 int score_math[30]; 와 같이 배열을 선언하고 사용할수 있다. 

하지만, 그 반 학생의 이름, 번호, 수학성적, 영어성적를 저장하고 싶다면 아래와 같이 구조체를 정의하여 사용하면  편리하다.


//학생 구조체 정의

struct Student  //구조체 이름

{

//구조체에 들어갈 항목 선언

char name[20];

int number;

int score_math;

int score_english;

};


구조체 선언은 다음과 같이한다.

struct  Student st1; //struct Student는 하나의 데이터타입으로 취급된다.

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


구조체 선언시 struct를 써줘야하는 번거로움을 피하기위해 typedef를 사용할수있다. 

typedef struct Student

{

char name[20];

int number;

int score_math;

int score_english;

}ST;

이렇게 해주면 


ST st1; 이와 같이 변수 선언이 가능하다. 


그리고 구조체는 연속된 메모리로 저장이된다.

즉 구조체의 각항목이 메모리에 분리되어 저장되어있지 않고 연속적으로 저장되어있다는 뜻이다. 



참고)

구조체는 위와 같이 3가지 방법으로 정의하고 선언할수 있는데

1번은 정의와 선언을 따로 해주었고 2,3번은 정의와 선언을 동시에 해준것이다. 

하지만, 3번처럼 구조체를 정의하면 구조체변수 선언을 다시 할수없다.

구조체의 정의와 선언은 보통 1번처럼 많이 한다.





구조체 초기화와 접근

구조체 초기화는  다음과 같이 할수 있다.

struct Student str1 = {"최지연", 23,90,85}; 


구조체의 데이터 항목에 접근하고 싶다면 점연산자(.)나 화살표 연산자(->)를 쓰면 된다.


 예를 들어 str1.name = "G.ma"; 이렇게 항목의 데이터를 바꿀수 있다.


화살표 연산자는 구조체의 주소를 알때 사용할수있다.

예를 들어,

struct Student *str2; 

이렇게 학생구조체의 포인터변수를 선언했다고 치자.

str2 = & str1;

그리고 str2에는 str1의 주소값을 넣어주었다.

str2->number = 12; 이제 이렇게 포인터 변수와 화살표 연산자를 이용해 str1의 항목의 데이터들을 접근할수있다. 


'FALL in > G.MA' s C' 카테고리의 다른 글

[C프로그래밍] - Call by Value vs. Call by Reference  (0) 2016.03.29
[C프로그래밍] - 메모리  (0) 2016.03.28
[C프로그래밍] - 재귀호출  (2) 2016.03.28
[C프로그래밍] - 포인터  (0) 2016.03.27
[C프로그래밍] - 배열  (0) 2016.03.27