..

Search

41) 포인터와 구조체

41) 포인터와 구조체

포인터와 구조체


구조체 배열 선언

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원입니다.


연습문제