항상 대충 보고 음 그렇군하고 까먹는 구조체..
간단하게라도 정리 해보고자 한다🧚🏻
#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("Psi 에 대한 정보 \n");
printf("나이 : %d \n", Psi.age);
printf("키 : %d \n", Psi.height);
printf("몸무게 : %d \n", Psi.weight);
return 0;
}
struct Human은 구조체이다.
그리고 struct human은 int나 char처럼 형타입에 불가하다.
해당 구조체의 멤버에 접근하기 위해서는 .을 사용한다. (pair<int, int>의 첫 번째 멤버에 접근하기 위해서 .first를 사용한 것과 마찬가지이다.)
구조체내에서는 초기화될 수 없다.
struct Books {
char name[30];
char auth[30];
char publ[30];
int borrowed;
}; //;하는거 잊지 말기
라는 구조체가 있을 때 struct Book book_info[100]이라는 변수를 만들었다고 생각해보자 이는 int ex[100]이 타입이 int인 100개의 배열과 동일하다. 그냥 타입이 구조체 Book인 배열 100개이다.
각 배열에는
for (i = 0; i < 3; i++) {
printf("책 %d 정보 입력 : ", i);
scanf("%s%s%s", book_list[i].name, book_list[i].auth, book_list[i].publ);
book_list[i].borrowed = 0;
}
[]를 통해 접근할 수 있다(just like array)
struct test {
int a, b;
};
int main() {
struct test st;
struct test *ptr;
ptr = &st;
(*ptr).a = 1;
(*ptr).b = 2;
}
구조체를 가리키는 포인터는 구조체 *ptr로 선언하면 된다. 그럼 ptr에는 st구조체의 주소가 들어간다. 이때 ->를 사용해서 "(포인터변수가 가리키는 주소).멤버"를 더 쉽게 표현할 수도 있다.
아름다운 부분이다.
#include <stdio.h>
char copy_str(char *dest, char *src);
struct TEST {
int i;
char str[20];
};
int main() {
struct TEST a, b;
b.i = 3;
copy_str(b.str, "hello, world");
a = b;
printf("a.str : %s \n", a.str);
printf("a.i : %d \n", a.i);
return 0;
}
a라는 구조체에 =를 통해 b를 대입하면 a는 b의 모든 값을 동일하게 갖는다. a.str과 a.i를 출력하면 b의 멤버들과 동일하게 3과 "hello, world"가 나올 것이다.
#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;
}
human으로 선언한 구조체의 주소를 넘긴다(그냥 배열처럼 이름만 적는다고 주소가 넘어가지 않는다.) 매개변수로 구조체를 받기위해 struct TEST *a가 된다.
여기서 copy_str()이라는 함수에 매개변수로 human.name을 넘긴다. 이는 배열이기 때문에 이름 자체가 주소가 된다.
#include <stdio.h>
struct employee
{
int age;
int salary;
};
struct company
{
struct employee data;
char name[10];
};
int main(void)
{
struct comapny Kim;
Kim.data.age = 31;
Kim.data.salary = 4500000;
return (0);
}
#include <stdio.h>
char copy_str(char *dest, char *src);
int Print_Obj_Status(struct obj OBJ);
struct obj {
char name[20];
int x, y;
} Ball;
int main() {
Ball.x = 3;
Ball.y = 4;
copy_str(Ball.name, "RED BALL");
Print_Obj_Status(Ball);
return 0;
}
int Print_Obj_Status(struct obj OBJ) {
printf("Location of %s \n", OBJ.name);
printf("( %d , %d ) \n", OBJ.x, OBJ.y);
return 0;
}
char copy_str(char *dest, char *src) {
while (*src) {
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return 1;
}
이전까지는 int main()안에서 "구조체 변수명"을 선언했다. 하지만struct{} 이후에 Ball을 선언한 것과 같이 작성하면 해당 구조체를 구조로 가진 변수를 선언한 것과 동일하다. 만약
struct person
{
char name[20];
int age;
} rick, morty;
라고 작성하면 struct person rick과 struct persin morty를 선언한 것과 동일하다.