struct 구조체이름{
멤버들..
char str[10];
int i;
}; //마지막에 꼭 붙인다
서로 다른 형태를 묶어서 쓸수 있게 해준다.
struct 구조체이름 변수명
타입은 struct 구조체이름이다
#include <stdio.h>
struct Human {
int age;
int height;
int weight;
};
int main() {
struct Human Psi;
Psi.age = 99;
Psi.height = 185;
Psi.weight = 80;
printf("%d\n", Psi.age);
printf("%d\n", Psi.height);
printf("%d\n", Psi.weight);
return 0;
}
struct test {
int a, b;
};
int main() {
struct test st;
struct test* ptr;
ptr = &st;
(*ptr).a = 1; //st.a와 동일
(*ptr).b = 2; //st.b와 동일
printf("st 의 a 멤버 : %d \n", st.a);
printf("st 의 b 멤버 : %d \n", st.b);
return 0;
}
.이 *보다 우선순위 높아서 묶어줘야한다.
ptr->a = 1; //st.a와 동일
ptr->b = 2; //st.b와 동일
이러한 문제를 해결하기 위해서 ->로 표시한다.
struct Test {
int c;
int* pointer;
};
int main()
{
struct Test t;
struct Test* pt = &t;
int i = 0;
t.pointer = &i;
*t.pointer = 3;
printf("i : %d \n", i);
*pt->pointer = 4;
printf("i : %d\n", i);
return 0;
return 0;
}
우선순위가 .이 높아서 *(t.pointer) *(pt->pointer) 이렇게 동작한다
int add_one(int* a);
struct Test {
int c;
};
int main()
{
struct Test t;
struct Test* pt = &t;
pt->c = 0;
add_one(&t.c);
printf("%d\n", t.c);
add_one(&pt->c);
printf("%d\n", t.c);
return 0;
}
int add_one(int* a)
{
*a += 1;
return 0;
}
#include <stdio.h>
struct TEST {
int age;
int gender;
};
int set_human(struct TEST a, int age, int gender);
int main() {
struct TEST human;
set_human(human, 10, 1);
printf("AGE : %d // Gender : %d ", human.age, human.gender);
return 0;
}
int set_human(struct TEST a, int age, int gender) {
a.age = age;
a.gender = gender;
return 0;
}
틀린코드다 고쳐보자(아래정답)
#include <stdio.h>
struct TEST {
int age;
int gender;
};
int set_human(struct TEST *a, int age, int gender);
int main() {
struct TEST human;
set_human(&human, 10, 1);
printf("AGE : %d // Gender : %d ", human.age, human.gender);
return 0;
}
int set_human(struct TEST *a, int age, int gender) {
a->age = age;
a->gender = gender;
return 0;
}
구조체도 다른 변수들과 마찬가지로 함수에 주소값을 넘겨줘야 값이 바뀐다.
#include <stdio.h>
struct TEST {
int age;
int gender;
char name[20];
};
int set_human(struct TEST* a, int age, int gender, const char* name);
char copy_str(char* dest, const char* src);
int main() {
struct TEST human;
set_human(&human, 10, 1, "Lee");
printf("AGE : %d // Gender : %d // Name : %s \n", human.age, human.gender,
human.name);
return 0;
}
int set_human(struct TEST* a, int age, int gender, const char* name) {
a->age = age;
a->gender = gender;
copy_str(a->name, name);
return 0;
}
char copy_str(char* dest, const char* src) {
while (*src) {
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return 1;
}
char이 어떻게 넘어가는지 살펴보기
struct employee {
int age;
int salary;
};
struct company {
struct employee data;
char name[10];
};
int main()
{
struct company Kim;
Kim.data.age = 31;
Kim.data.salary = 3000000;
printf("Kim's age : %d \n", Kim.data.age);
printf("Kim's salary : %d $/year \n", Kim.data.salary);
return 0;
}
구조체도 하나의 Type이라서 지극히 자연스러운 모습이다
struct obj {
char name[20];
int x, y;
}Ball;
struct obj Ball;과 같다
struct HUMAN {
int age;
int height;
int weight;
int gender;
};
int main()
{
struct HUMAN Adam = { 31, 182, 75, 0 };
struct HUMAN Eve = { 27, 166, 48, 1 };
return 0;
}
초기화를 {}안에 넣어서 해주면 더 편하다
프로그램 속도 향샹을 위해서 바이트패딩이라는 규칙을 사용한다.
컴파일러는 메모리의 접근을 쉽게 하기 위해 크기가 가장 큰 멤버 변수 기준으로 메모리 크기를 맞추게
된다(바이트 패딩)
이때 추가 되는 바이트를 패딩바이트라고 말한다.
typedef (이름을 부여하고자 하는 타입) (새로 준 타입의 이름)
구조체에
struct HUMAN{
…
}
struct HUMAN Human
or
typedef struct HUMAN{
…
}Human;
이렇게 사용하면 기존에 struct HUMAN h1 이렇게 지정해야 하지만
typedef을 사용하면 Human h1 이렇게 간단하게 만들어서 사용가능하다.