IT/C

구조체

우루사이 2024. 2. 27. 14:47

구조체 선언

# 구조체 자료형의 선언과 변수 선언을 함께 하는 방법
struct typeA{
...
}var;

# 구조체 자료형의 선언과 변수 선언을 따로 하는 방법
struct typeA{
...
};

struct typeA var;

# 태그명을 붙이지 않고 자료형과 변수를 동시에 선언하는 방법
struct{
...
}var;

# or
typedef struct score{
...
}SCORE;

SCORE student;
  • SCORE는 변수의 이름이 아니라 자료형의 이름(구조체 변수 선언)

구조체 변수의 사용

  • 구조체 선언시 선언한 멤버 순서대로 메모리 할당
    • 전체를 한꺼번에 취급 가능
    • 그 안의 멤버들을 따로따로 취급 가능
  • 구조체 변수의 멤버들을 나타낼 때에는 변수 명 바로 옆에 .(점)과 멤버명을 붙여서 표현
  • 구조체 멤버들을 처리할 때에는 멤버들의 자료형에 맞추어 처리
  • 동일한 구조체 자료형의 변수는 대입 연산자를 이용하여 한번에 대입 가능
  • SCORE student1, student2; ...; student2=student1;

구조체 배열

int main()
{
    typedef struct score{
        ...
    }SCORE;

    SCORE st[30];

구조체 배열 중 일부 초기화

memset(&st[2], 0, sizeof(SCORE));
  • 메모리 영역을 초기화하는 함수인 memset을 사용하여 구조체 배열 st의 세 번째 요소부터 sizeof(SCORE)만큼의 바이트를 0으로 설정

구조체 배열과 구조체 포인터 변수의 적용

int main()
{
    typedef struct member{
        int id;
        char name[20];
    }MEMBER;

    MEMBER* prt;
    MEMBER marray[MAX];

    prt=marray;
    for(i=0, i<MAX; i++){
        scanf("%d%*c", &ptr->id);
        ...
        gets(ptr->name);
        ptr++;
    }
    count=i;
    ptr=marray;
    for(i=0, i<count; i++){
        (ptr+i)->id, (ptr+i)->name);
    }
    return 0;
}      
  • %d: 정수 입력
  • %c: % 포맷은 해당 입력을 받고 그 값을 무시합니다. 여기서는 입력된 콤마(,)를 무시
  • &ptr->id: 구조체 포인터 ptr이 가리키는 구조체의 id 멤버 변수에 값을 저장

자기 참조형 구조체의 정의와 예

typedef struct member{
    int id;
    char name[20];
    struct member* next;
}MTYPE;
MTYPE people1, people2;
  • next:
    • 같은 구조체 자료형의 변수메모리의 주소를 저장 가능
    • struct member, 즉 자기 자신과 동일한 자료형을 가리킴
  • people1과 people2가 people1.next 멤버를 통해 연결된 상태
  • people1.next == &people2
  • people1.next->id == people2.id
  • people1.next->name == people2.name
  • 연결 리스트(linked list) 개념

자기 참조형 구조체와 동적 메모리 할당

  • 메모리의 할당을 의미 -> 변수의 선언, 동적 메모리 할당 함수 이용