이번 편의 목표: 번호, 제목, 가격을 하나의 구조체로 묶고, 포인터로 멤버에 접근합니다.

구조체는 서로 다른 자료형을 한 값으로 묶습니다. 변수 뒤의 . 은 그 객체의 멤버를 고릅니다. 포인터 뒤의 ->는 그 주소가 가리키는 객체의 멤버를 고릅니다.

C
#include <stdio.h>
#include <string.h>

struct Book {
    int id;
    char title[32];
    int price;
};

void print_book(const struct Book *book) {
    if (book == NULL) {
        return;
    }
    printf("%d %s %d\n", book->id, book->title, book->price);
}

int main(void) {
    struct Book book;

    book.id = 1;
    book.price = 12000;
    snprintf(book.title, sizeof(book.title), "%s", "개미");
    print_book(&book);
    return 0;
}

출력은 1 개미 12000 입니다. print_book은 구조체 전체가 아니라 주소를 받습니다. 함수 안에서 멤버를 바꾸지 않으므로 const를 붙입니다. 구조체를 값으로 넘기면 멤버가 복사됩니다. 제목 배열까지 복사되므로, 읽기만 할 때는 포인터가 분명합니다.

멤버 title은 11편의 문자열과 같은 규칙입니다. 길이가 32인 배열이고 널 문자로 끝납니다.

직접 해 보기

가격이 1800인 공책을 book에 넣고 print_book으로 출력하세요.

해설

id, 제목, 가격 순으로 출력됩니다. snprintf의 대상은 book.title이고 크기는 sizeof(book.title)입니다. 점 연산자로 넣은 값을 포인터 매개변수가 ->로 읽습니다.