8.4 구조체를 필드로 가지는 구조체 [gdoc] [smts]
어떤 구조체의 필드가 다른 구조체의 변수가 될 수도 있다. 직사각형의 정보를 갖는 Rect라는 구조체를 작성해 보자. 이 구조체는 마주보는 두 꼭지점의 의 좌표를 가지고 있어야 한다.
typedef struct {double x;double y;} Point;typedef struct {Point leftTop;Point rightBot;} Rect; |
여기에서 보면 Rect 구조체는 두 개의 Point 구조체 변수를 가지고 있다. 이런 식으로 구조체의 필드가 다른 구조체의 변수가 될 수 있다.
구조체 Rect를 초기화 시키는 방법은 다음과 같이 몇 가지 방법이 있다.
// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함Rect ra = {{0, 1}, {11, 12}};// 초기화 방법 2 : 이미 정의된 Point 변수 이용Point p1 = {0, 1}, p2 = {11, 12};Rect rb = {p1, p2};// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입Rect rc;rc.leftTop.x = 0;rc.leftTop.y = 1;rc.rightBot.x = 11;rc.rightBot.y = 12; |
이제 사각형의 면적을 구하는 함수를 추가한 전체 소스 코드는 다음과 같다.
ex08-08.c |
#include <stdio.h>typedef struct {double x;double y;} Point;typedef struct {Point leftTop;Point rightBot;} Rect;double calcArea(Rect);int main(int argc, char **argv) {// 초기화 방법 1 : 모든 구조체 변수를 생성과 동시에 초기화함Rect ra = {{0, 1}, {11, 12}};// 초기화 방법 2 : 기정의 된 Point 변수 이용Point p1 = {0,1}, p2 = {11, 12};Rect rb = {p1, p2};// 초기화 방법 3: 선언 후 각각의 필드에 초기값 대입Rect rc;rc.leftTop.x = 0;rc.leftTop.y = 1;rc.rightBot.x = 11;rc.rightBot.y = 12;printf("area of ra : %f\n", calcArea(ra));printf("area of rb : %f\n", calcArea(rb));printf("area of rc : %f\n", calcArea(rc));}double calcArea(Rect r) {double dx = r.rightBot.x - r.leftTop.x;double dy = r.rightBot.y - r.leftTop.y;return dx*dy;} |
실행 결과 |
area of ra : 121.000000area of rb : 121.000000area of rc : 121.000000 |
이와 같이 구조체의 필드로 다른 구조체 변수도 얼마든지 사용할 수 있다. 다만 구조체를 정의하는 순서에 유의하면 된다. 당연한 얘기지만 Rect 구조체가 Point 구조체 뒤에 와야 한다.
'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글
8.6 구조체 포인터 변수 (0) | 2016.04.15 |
---|---|
8.5 구조체 배열 (0) | 2016.04.15 |
8.3 구조체를 함수의 인자로 넘기기 (0) | 2016.04.15 |
8.2 구조체 필드의 초기화 (0) | 2016.04.15 |
8.1 구조체의 정의 (0) | 2016.04.15 |