구조체
사용자가 C언어의 기본 타입들을 가지고 새롭게 정의하는 사용자 정의 타입
같은 타입의 변수 집합이 배열이라면, 구조체는 다양한 타입의 변수 집합
구조체를 구성하는 변수를 구조체의 멤버/멤버 변수라고 함
문법
선언
구조체는 struct 키워드를 이용해 정의
struct Person
{
char name[20];
int age;
char address[100];
};
이때, name, age, address는 구조체 Person의 멤버 변수
구조체를 더 편하게 사용하려면 앞에 매번 struct를 붙여야 함(Person 단독 사용 불가)
더 편하게 쓰기 위해 typedef를 같이 사용
(*typedef: 이미 존재하는 타입에 새로운 이름을 붙이려고 사용하는 키워드)
typedef struct Person
{
char name[20];
int age;
char address[100];
} person;
이렇게 하면 struct 없이 person이라고만 해도 구조체를 가리켜 사용할 수 있음
또는,
struct Person
{
char name[20];
int age;
char address[100];
};
int main(void)
{
struct Person person;
...
}
이렇게 함수 안에서 다시 이름을 붙여도 가능
구조체 초기화
person = {.name = "hello", .age = 5, .address = "123, 1-gu, 2-si"};
person = {"hello", 5, "123, 1-gu, 2-si"};
person.name = "hello";
person.age = 5;
person.address = "123, 1-gu, 2-si";
멤버 변수 접근
구조체 이름.멤버 변수 이름
printf("Name: %d", person.name);
구조체 포인터
함수 내부에서 외부에 있는 구조체 변수에 직접 접근하기 위해 사용
여러 개의 구조체가 필요한 상황에서 구조체마다 할당을 받아 버리면 메모리가 낭비되므로 malloc과 free로 동적 할당을 해 주는 게 메모리 관리에 효과적
구조체를 사용할 때 메모리 할당:
구조체 이름 * 포인터 이름 = malloc(sizeof(구조체 이름));
struct Person *pp = malloc(sizeof(struct Person));
할당한 메모리 내에서 실제로 구조체 포인터가 가리키는 주소에 값 넣기:
포인터 이름 -> 멤버 변수 이름 = 값
pp->name = "hello";
이런 문법도 가능:
(*포인터 이름).멤버 변수 이름 = 값
(*pp).name = "hello"
구조체 원소에 접근할 수 있는 방법은 두 가지로, 포인터 또는 연산자 이용하기
이때, 포인터를 이용해 구조체 원소에 접근할 때는 화살표
멤버 변수를 이용해 구조체 원소에 접근할 때는 도트 연산자 사용
참고
'Programming Language > C' 카테고리의 다른 글
[C] 특정 규칙에 따라 문자열을 숫자로 변환하기 (0) | 2024.03.18 |
---|---|
[C] 포인터 선언과 역참조 (0) | 2024.03.11 |
[C] 포인터 연산 (0) | 2024.03.11 |
[C] C언어의 스토리지 클래스(기억 영역, Storage Class) (0) | 2024.03.07 |
[C] 실수 자료형 float, double 소수점 출력 범위 지정 (1) | 2024.03.06 |