728x90
1. 구조체 (사용자 정의 자료형) 와 연결 리스트
2. 열거형 enum
구조체 (사용자 정의 자료형)
- 구조체 struct
- 다양한 자료형을 하나로 묶을 수 있는 복합 자료형 (사용자가 만드는 자료형)
- 구조체 선언과 변수
- 구조체 선언: struct 구조체명 { 구조체 멤버 }
- 구조체 변수: struct 구조체명 구조체_변수명;
- 구조체 변수를 선언 시 실제 저장 공간이 할당되며 메모리에 연속적으로 할당된다.
- 함수 밖에 선언하면 함께 선언되는 변수가 전연변수가 된다. (-> 초기화 안 할 경우 0 자동 초기화)
// 구조체 선언 방법
struct Person {
char name[20];
int age;
float height;
};
// 구조체 변수 선언
struct Person p1;
- 구조체 멤버 접근 (멤버 접근 연산자 . )
- 구조체 변수명 . 멤버명
// 멤버 접근
p1.age = 25;
strcpy(p1.name, "Alice");
p1.height = 160.5;
- 구조체 변수의 크기
- 모든 멤버의 크기 합 + 패딩 바이트
- 컴파일러는 구조체 멤버의 크기가 다른 경우, 멤버 사이에 패딩 바이트를 넣어 멤버를 정렬한다. (=> 바이트 얼라인먼트)
struct ex {
char a; // 1 byte
int b; // 4 bytes
};
==> 패딩 포함 8 bytes
- 구조체 변수 초기화 및 복사
// 구조체 변수 초기화
struct Person p1 = {"Bob", 30, 175.2};
// 구조체 복사
struct Person p2;
p2 = p1;
- 구조체를 반환하는 함수
- 함수 정의
- struct 구조체명 함수명(struct 구조체명 매개변수명) { }
- 함수 호출
- struct 구조체명 함수명
- 함수 정의
#include <stdio.h>
#include <string.h>
// 구조체 정의
struct Person {
char name[20];
int age;
};
// 구조체를 매개변수로 받아서 반환하는 함수
struct Person increaseAge(struct Person p) {
p.age += 1;
return p;
}
void main() {
struct Person p1 = {"Tom", 20};
// 함수 호출: 구조체 전달 및 반환
struct Person p2 = increaseAge(p1);
}
- 구조체 포인터
- (*구조체) . 접근할 멤버
- 멤버 접근 연산자 . 보다 포인터 연산자 * 가 우선순위가 더 높으므로 () 괄호가 필요
- 간접 멤버 접근 연산자 -> 로 대체 가능
struct score
{
int kor;
int eng;
};
int main(void)
{
struct score s = { 10, 20 };
struct score *ps = &s;
printf("과목1: %d", (*ps).kor);
printf("과목2: %d", ps->kor);
}
- 자기 참조 구조체와 연결 리스트
- 자기 참조 구조체는 자신의 구조체를 가리키는 포인터를 멤버로 가진다.
- 연결 리스트는 구조체 변수를 포인터로 연결한 것이다.
- 첫 번째 변수 위치만 알면 포인터를 따라가 나머지 변수 모두 사용이 가능하다.
- 첫 번째 변수의 위치를 head 포인터에 저장해 사용한다.
struct list
{
int num;
struct list *next; //자기 참조 구조체
};
int main(void)
{
struct list a = {10, 0}, b = {20, 0};
struct list *head = &a;
struct list *current;
a.next = &b; //a 포인터 멤버가 b를 가리킴
printf("%d", head->num); // 10
printf("%d", head->next->num); // 20
}
열거형
- 열거형 enum
- enum 열거형 명 { 기호화된 정수 값들 }
- 열거형은 변수에 저장할 수 있는 정수 값을 기호로 정의하여 나열
- 초기값이 없을 경우 0부터 차례대로 초기화된다.
enum season {SPRING, SUMMER, FALL = 5, WINTER};
// SPRING => 0
// SUMMER => 1
// FALL => 5
// WINTER => 6'C > C 문법' 카테고리의 다른 글
| 문자열 앞으로 당기기 (메모리 이동) _memmove (0) | 2025.09.30 |
|---|---|
| 혼자 공부하는 C언어 (18~19강) (0) | 2025.09.09 |
| 혼자 공부하는 C언어 (15~16강) (0) | 2025.09.07 |
| 혼자 공부하는 C언어 (13~14강) (0) | 2025.09.07 |
| 혼자 공부하는 C언어 (11~12강) (1) | 2025.09.07 |