Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

나의 IT일지

구조체 내 구조체 본문

프로그래밍 언어/C언어

구조체 내 구조체

세레프 2023. 3. 4. 05:47

 구조체여러가지 자료형을 가진 변수의 집합을 가진 틀로, 자료형으로 구분되며, 구조체형을 정의하고, 구조체 변수를 정의해서 사용한다.

구조체형 정의 구조체변수 정의
struct 구조체명{

    자료형 변수명1;
    자료형 변수명2;

};
struct 구조체명 변수명;

 

구조체 내 구조체

  구조체변수는 변수이기에 구조체의 필드로 사용할 수 있다. 즉, 새로운 구조체에 다른 구조체를 넣어서 사용할 수 있다.

구조체 밖에서 구조체 정의 구조체 내에서 구조체 구현
struct 구조체1{

    자료형 변수명3;
    자료형 변수명4;

};

struct 구조체2{

    자료형 변수명1;
    자료형 변수명2;
    struct 구조체1 구조체변수명

};
struct 구조체1{

    자료형 변수명1;
    자료형 변수명2;

struct 구조체2{
    자료형 변수명3;
    자료형 변수명4;
}구조체변수명;

};

 첫번째 구조두번째 구조체 밖에서 첫번째 구조체의 형태를 정의한 뒤, 첫번째 구조체형을 가진 변수를 두번째 구조체의 필드로 사용하는 방식으로, 첫번째 구조체를 다른 곳에서도 사용할 때 사용하는 방식이다. 

#include<stdio.h>

struct drivingPermit {
	char issuedAt[20];	//발급장수
	long dateofissue;	//발급년월일
	long permitNo;		//면허번호
};
struct person {
	char name[20];
	char birth[12];
	long number;
	struct drivingPermit driving;
};

int main() {

	struct person per1;
	per1.driving.dateofissue = 20190110;
	per1.driving.permitNo = 1029312;
	printf("%d, %d\n", per1.driving.dateofissue, per1.driving.permitNo);
	return 0;
}

 위의 코드는 첫번째 구조를 사용하여 구조체 내에 구조체를 넣은 코드로, "drivePermit" 구조체를 정의한 뒤에, "person" 구조체에 "drivePermit" 구조체형을 가진 변수를 만들고 "person" 구조체를 정의하는 것을 볼 수 있다.

 

 두번째 구조 구조체 내에서 구조체를 정의한 뒤, 구조체 변수를 만드는 방식으로, 구조체 내에서만 사용할 때 사용하는 방식이다.

#include<stdio.h>

struct person {
	char name[20];
	char birth[12];
	long number;
	struct drivingPermit {
		char issuedAt[20];	//발급장수
		long dateofissue;	//발급년월일
		long permitNo;		//면허번호
	}driving;
};

int main() {

	struct person per1;
	per1.driving.dateofissue = 20190110;
	per1.driving.permitNo = 1029312;
	printf("%d, %d\n", per1.driving.dateofissue, per1.driving.permitNo);
	return 0;
}

 위의 코드는 두번째 구조를 사용하여 구조체 내에 구조체를 넣은 코드로, "person" 구조체를 정의하는 도중에,   "drivingPermit" 구조체를 정의하면서 변수를 생성하는 것을 볼 수 있다.

 

 

구조체 내 구조체 초기화

 변수는 생성하면서 초기값을 저장하는 초기화가 가능하다. 그렇다면 구조체 내 구조체형을 가진 변수는 어떻게 초기화를 할까?

1번 방법 2번 방법
struct 구조체명 구조체변수명 = {

    .필드1=값1
    .필드2=값2
    {.필드3=값3
    .필드4=값4...}

};
struct 구조체 구조체변수명 = {값1,값2,{값3,값4}};

 구조체형 변수를 포함하고 있는 구조체형 변수는 위와 같이 2가지 방법으로 초기화 할 수 있다. 필드와 값을 함께 적는 방법값만 적는 방법이 존재하는데, 두 방법의 공통점은 구조체형 변수의 필드는 중괄호로 구분하여 초기화한다는 점이다. 

#include<stdio.h>

struct person {
	char name[20];
	char birth[12];
	long number;
	struct drivingPermit {
		char issuedAt[20];	//발급장수
		long dateofissue;	//발급년월일
		long permitNo;		//면허번호
	}driving;
};

int main() {

	struct person per1 = {
		.name = "김민호",
		.birth= "19990120",
		.number = 9271281,
		{
		.issuedAt="대한민국 서울",
		.dateofissue=20190313,
		.permitNo=192311
		}
	
	};
	
	struct person per2 = { "박민우","19951202",9212371,
	{"대한민국 부산",20190218,291310} 
	};
	
	printf("per1.name=%s\n", per1.name);
	printf("per2.name=%s\n", per2.name);
	printf("per1.driving.issuedAt=%s\n", per1.driving.issuedAt);
	printf("per2.driving.issuedAt=%s\n", per2.driving.issuedAt);

	return 0;
}

 위의 코드는 구조체 내에서 구조체를 정의한 방식을 사용하며, "per1"변수는 값과 필드명을 이용한 초기화방법을 "per2"변수는 값만을 이용한 초기화방법을 사용한다.

 그리고 "per1"변수에서 중괄호 내부의 필드명을 보면 구조체 내에서 정의하는 구조체의 필드명과 같은것을 확인 할 수 있다. 이는 중괄호의 값은 구조체 내에서 정의하는 구조체형을 가진 변수의 초기값인 것을 알 수 있다.

 

 

 

 

 


번외) 자료형의 재정의 typedef

 "typedef"함수는 자료형을 재정의하는 함수로 자료형의 이름을 재정의할 때 사용한다.

typedef 자료형 바꿀이름;

 구조체 또한 자료형을 정의하여 사용하기에 "typedef"함수를 이용하여 이름을 변경 할 수 있다. 

  typedef struct 구조체명{

    자료형 변수명;
    자료형 변수명;

...}구조체별명;
 
#include<stdio.h>

typedef struct person {
	char name[20];
	char birth[12];
	long number;
	struct drivingPermit {
		char issuedAt[20];	//발급장수
		long dateofissue;	//발급년월일
		long permitNo;		//면허번호
	}driving;
}person;			        //구조체형의 재정의

int main() {

	person per1 = {
		.name = "김민호",
		.birth = "19990120",
		.number = 9271281,
		{
		.issuedAt = "대한민국 서울",
		.dateofissue = 20190313,
		.permitNo = 192311
		}
	};

	person per2 = { "박민우","19951202",9212371,
	{"대한민국 부산",20190218,291310}
	};

	printf("per1.name=%s\n", per1.name);
	printf("per2.name=%s\n", per2.name);
	printf("per1.driving.issuedAt=%s\n", per1.driving.issuedAt);
	printf("per2.driving.issuedAt=%s\n", per2.driving.issuedAt);

	return 0;
}

'프로그래밍 언어 > C언어' 카테고리의 다른 글

공용체  (0) 2023.03.08
구조체와 비트필드  (0) 2023.03.07
구조체 포인터  (1) 2023.03.03
구조체 배열  (1) 2023.03.02
구조체 기본  (0) 2023.03.01
Comments