c언어 구조체(struct)

말차·2022년 8월 5일

🌼지식🌼

목록 보기
1/10

항상 대충 보고 음 그렇군하고 까먹는 구조체..
간단하게라도 정리 해보고자 한다🧚🏻

1. 구조체

#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를 사용한 것과 마찬가지이다.)

구조체내에서는 초기화될 수 없다.

2. 구조체 배열

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)

3. 구조체 포인터

struct test {
  int a, b;
};
int main() {
  struct test st;
  struct test *ptr;

  ptr = &st;

  (*ptr).a = 1;
  (*ptr).b = 2;
}

구조체를 가리키는 포인터는 구조체 *ptr로 선언하면 된다. 그럼 ptr에는 st구조체의 주소가 들어간다. 이때 ->를 사용해서 "(포인터변수가 가리키는 주소).멤버"를 더 쉽게 표현할 수도 있다.

4. 구조체의 대입

아름다운 부분이다.

#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"가 나올 것이다.

5. 구조체를 인자로 전달하기

#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을 넘긴다. 이는 배열이기 때문에 이름 자체가 주소가 된다.

6. 구조체 안의 구조체

#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);
}

7. 구조체의 정의 방법

#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를 선언한 것과 동일하다.

0개의 댓글