: 여러 자료형을 가진 변수들을 하나로 묶어 자료형으로 사용할 수 있도록 정의하는 것
= 새로운 type을 만들어 내는 것
'struct' 뒤에 구조체의 이름을 정해주고, 중괄호 블럭 안에 필요한 변수들을 선언하여 사용한다.
struct student{
int s_id;
char name[20];
};
먼저, 구조체를 사용하기 전에 선언을 먼저 해줘야 된다.
struct student st1;
변수명 뒤에 '.'을 붙여 구조체 내의 변수에 접근을 한다.
int main(){
struct student st1;
st1.s_id = 10;
strcpy(st1.name, "kang ji won");
printf("s_id : %d\n", st1.s_id);
printf("name : %s\n", st1.name);
printf("struct size : %ld\n", sizeof(st1));
return 1;
}
실행결과
s_id : 10
name : kang ji won
struct size : 24
struct size는 int 4byte, char [20] 20byte이므로 총 24바이트이다.
* 자바에서 클래스의 크기를 재보면 이렇게 딱 용량이 맞지 않는다. 기존 상속되는 부모,.. 등등의 용량을 차지하기 때문이다.
매번 구조체를 사용할 때 위와 같이 선언하면 너무 길고 불편하다.
typedef를 사용하여 구조체를 쉽게 사용할 수 있다.
typedef struct student{
int s_id;
char name[20];
} STU;
int main(){
STU st1;
st1.s_id = 10;
strcpy(st1.name, "kang ji won");
printf("s_id : %d\n", st1.s_id);
printf("name : %s\n", st1.name);
printf("struct size : %ld\n", sizeof(st1));
return 1;
}
이런식으로 구조체에 STU라는 이름을 붙여 type처럼 사용할 수 있다.
함수호출을 했을 때 메인함수에 접근할 수 없기 때문에 값 복사가 이루어지고 메인함수에 접근하기 위해서는 포인터를 사용해야 한다.
#include <stdio.h>
#include <string.h>
typedef struct student{
int s_id;
char name[21];
}std;
void std_func(std st);
int main(){
std st1;
std_func(st1);
printf("s_id2 : %d\n", st1.s_id);
printf("name2 : %s\n", st1.name);
return 1;
}
void std_func(std st){
st.s_id = 10;
strcpy(st.name, "kang ji won");
printf("s_id1 : %d\n", st.s_id);
printf("name1 : %s\n", st.name);
}
실행결과
s_id1 : 10
name1 : kang ji won
s_id2 : 1492606976
name2 : �
포인터를 사용하지 않았을 경우에는 메인함수에 접근할 수 없기 때문에 위와 같은 상황이 발생된다.
구조체에서 포인터를 사용하기 위해서는
st->s_id
이런 식으로 '->'를 이용해서 사용해야 한다.
#include <stdio.h>
#include <string.h>
typedef struct student{
int s_id;
char name[20];
}std;
void std_func(std * st);
int main(){
std st1;
std_func(&st1);
printf("s_id2 : %d\n", st1.s_id);
printf("name2 : %s\n", st1.name);
return 1;
}
void std_func(std * st){
st->s_id = 10;
strcpy(st->name, "kang ji won");
printf("s_id1 : %d\n", st->s_id);
printf("name1 : %s\n", st->name);
}
실행결과
s_id1 : 10
name1 : kang ji won
s_id2 : 10
name2 : kang ji won
#include <stdio.h>
#include <string.h>
typedef struct human{
char name[20];
int age;
char gender;
}human;
typedef struct student{
int s_id;
human man;
}std;
void st_func(std *st);
int main(){
std st1;
st1.s_id = 10;
strcpy(st1.man.name,"jiwon");
st1.man.age = 25;
st1.man.gender = 'm';
printf("s_id : %d\n",st1.s_id);
printf("name : %s\n",st1.man.name);
st_func(&st1);
printf("s_id : %d\n",st1.s_id);
printf("name : %s\n",st1.man.name);
return 1;
}
void st_func(std * st){
st->s_id = 100;
strcpy(st->man.name, "kang");
}
실행결과
s_id : 10
name : jiwon
s_id : 100
name : kang