구조체
사용자가 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"
구조체 원소에 접근할 수 있는 방법은 두 가지로, 포인터 또는 연산자 이용하기
이때, 포인터를 이용해 구조체 원소에 접근할 때는 화살표
멤버 변수를 이용해 구조체 원소에 접근할 때는 도트 연산자 사용
참고
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
C 문법 중 도트연산자와 ( . ) 화살표연산자 ( -> )
도트연산자와 ( . ) 화살표연산자 ( -> ) 모두 접근이라는 의미로 사용된다. 처음부터 다루어보자.구조체란 여러 자료형이 모여 하나의 큰 사용자 정의 자료형을 구성한 것이다. 여기서 우리가 구
velog.io
'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 |