본문 바로가기
C/C 문법

혼자 공부하는 C언어 (17강)

by Sein_ 2025. 9. 7.
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