* 구조체(Data structure)란 ?
프로그램의 규모가 커진다면, 변수를 계속해서 선언하는것은 비효율적이다. 이때 구조체를 사용하면 좀 더 효율적이다.
예를들어서, 100명의 사람의 인적사항을 저장하는 프로그램이라면, 100명 * (이름 , 나이, 주소) 까지 300백개의 변수가 필요하다. 구조체를 선언한다면, 구조체 속에 이름, 나이, 주소 3가지만 선언하고, 사람단위로 정보를 처리 할 수 있다.
* 구조체의 선언
기본적인 선언 방법
struct Person{
char name[10];
int age;
char address[30];
};
- 구조체는 위와 같이 선언한다.
- Person : 구조체 이름
- name, age, address : 구조체의 멤버 라고 한다.
- 구조체는 보통 main함수 밖에 정의한다. (전역적으로 사용하기 위함이다)
구조체를 이용하여 2명의 인적사항 생성하기.
#include <stdio.h>
struct Person{
char name[20];
int age;
char address[20];
};
int main(void)
{
struct Person p1 = {.name = "kim", .age = 30, .address = "seoul"};
struct Person p2 = {.name = "lee", .age = 20, .address = "tokyo"};
printf("p1's name : %s, p2's name : %s", p1.name, p2.name);
}
p1, p2는 "구조체 변수"이다. 그리고 구조체 속의 요소에 접근할때는 <.멤버이름>으로 접근하면 된다.
# Typedef를 이용한 구조체 선언
typedef 는 자료형의 별칭을 만드는 기능이다. 구조체를 만들때도 사용하지만, 다른 모든 자료형에도 사용 가능하다.
typedef <자료형> <별칭> 으로 사용 가능하다.
typedef int NUMBER;
// int를 NUMBER라는 별칭으로 만들었다.
NUMBER a = 9;
// 즉, int a = 9; 와 동일하다
printf("%d",a);
typedef로 구조체 선언하기
typedef struct Person {
char name[20];
int age;
char address[30];
} p_list;
int main(void)
{
p_list = p1;
}
- struct Person p1; 대신, 별칭을 사용하여 p_list p1; 으로 구조체를 선언할 수 있다.
- 이때, typedef와 별칭(t_list)은 사용하되 구조체의 이름(Person)을 적지 않고 구조체를 선언한다면, 익명구조체 라고 한다.
# 구조체 포인터
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Person {
char name[20];
int age;
char address[30];
}
int main(void)
{
struct Person *p1 = malloc(sizeof(struct Person));
//구조체 포인터 선언을 하기 위한 메모리 할당.
strcpy(p1->name, "lee");
p1->age = 30;
free(p1); // 메모리 해제
}
- 구조체 포인터의 경우에는 <.멤버이름>이 아닌, <구조체->멤버>로 접근하면 된다. (->는 화살표 연산자 라고 한다)
- 문자열 멤버에는 =(할당연산자) 사용이 안되므로, strcpy함수를 이용하여 문자열을 넣어주면 된다.
# 구조체 멤버가 포인터인 경우
#include <stdio.h>
#include <stdlib.h>
struct Data {
char c1;
int *numPtr;
}
int main(void)
{
int num1 = 10;
struct Data d1;
struct Data *d2 = malloc(sizeof(struct Data));
d2->numPtr = &num1;
printf("%d\n", *d2->numPtr);
free(d2);
};
접근하려는 멤버가 포인터인 경우에는 참조연산자 *를 붙여줘야한다.