포인터와 구조체
구조체 배열 선언
C 언어에서 배열의 요소가 될 수 있는 타입에는 제한이 없으므로, 구조체 역시 배열의 한 요소가 될 수 있습니다.
이러한 구조체 배열을 선언하는 방법은 다른 타입의 배열을 선언하는 방법과 같습니다..
또한, 구조체 배열에서 각 배열 요소로 접근하는 방법도 일반 배열의 접근 방법과 완전히 같습니다.
다음 예제는 구조체 배열의 선언 및 초기화를 보여주는 예제입니다.
예제
struct book text_book[3] =
{
{"국어", "홍길동", 15000},
{"영어", "이순신", 18000},
{"수학1", "강감찬", 10000}
};
puts("각 교과서의 이름은 다음과 같습니다.");
printf("%s, %s, %s\n", text_book[0].title, text_book[1].title, text_book[2].title);
실행 결과
각 교과서의 이름은 다음과 같습니다.
국어, 영어, 수학1
위의 예제처럼 구조체 배열은 2차원 배열의 초기화 방법과 똑같은 방법으로 초기화할 수 있습니다.
또한, 멤버 연산자(.)를 사용하여 각 배열 요소의 멤버에 접근할 수 있습니다.
다음 그림은 위의 예제에서 사용된 구조체 배열 text_book의 메모리 상태를 보여줍니다.
구조체를 가리키는 포인터
구조체 변수를 가리키는 구조체 포인터는 다음과 같이 선언합니다.
문법
struct 구조체이름* 구조체포인터이름;
예제
struct book* ptr_my_book;
배열의 경우와는 달리 구조체의 이름은 구조체를 가리키는 주소가 아닙니다.
따라서 포인터에 할당할 때에는 반드시 주소 연산자(&)를 사용해야 합니다.
구조체 포인터를 이용하여 구조체의 멤버에 접근하는 방법에는 다음과 같이 두 가지 방법이 있습니다.
1. 참조 연산자(*)를 이용하는 방법
2. 화살표 연산자(->)를 이용하는 방법
참조 연산자를 이용하는 방법은 다음과 같습니다.
문법
(*구조체포인터).멤버변수이름
예제
(*ptr_my_book).author
참조 연산자(*)는 멤버 연산자(.)보다 연산자 우선순위가 낮으므로 반드시 괄호(())를 사용해야 합니다.
구조체의 멤버에 접근하기 위해서 화살표 연산자(->)를 사용할 수도 있습니다.
화살표 연산자의 앞쪽에는 구조체 포인터를, 뒤쪽에는 접근하고자 하는 구조체의 멤버 변수 이름을 사용하면 됩니다.
문법
구조체포인터 -> 멤버변수이름
예제
ptr_my_book -> author
위의 두 가지 방법은 완전히 같은 동작을 하며, 일반적으로 화살표 연산자가 좀 더 많이 사용됩니다.
예제
struct book my_book = {"C언어 완전 해부", "홍길동", 35000};
struct book* ptr_my_book; // 구조체 포인트 선언
ptr_my_book = &my_book;
strcpy((*ptr_my_book).title, "C언어 마스터"); // 참조 연산자(*)를 이용하는 방법
strcpy(ptr_my_book->author, "이순신"); // 화살표 연산자(->)를 이용하는 방법
my_book.price = 32000; // 구조체 변수을 이용한 직접 수정
printf("책의 제목은 %s이고, 저자는 %s이며, 가격은 %d원입니다.\n",
my_book.title, my_book.author, my_book.price);
실행 결과
책의 제목은 C언어 마스터이고, 저자는 이순신이며, 가격은 32000원입니다.