유튜브 나도코딩 c언어 기초 강의 내용이 포함되어있습니다.
구조체란 한 개 이상의 변수를 묶어 그룹화시키는 사용자 정의 자료형이다.
똑같은 변수를 여러번 사용해야 하는 경우에 효과적으로 사용할 수 있다.
여러개의 변수를 하나로 묶어서 관리할 수 있게 되고, 그룹화할 때 같은 자료형을 가진 변수들을 묶거나, 서로 다른 자료형을 가진 변수들을 묶어서 그룹화할 수도 있다.
#include <stdio.h>
struct GameInfo {
char* name;
int year;
int price;
char* company;
}; // }구조체별칭;
int main(void)
{
// 구조체 사용
struct GameInfo gameinfo1;
gameinfo1.name = "나도게임";
gameinfo1.year = 2017;
gameinfo1.price = 50;
gameinfo1.company = "나도회사";
// 구조체 출력
printf("-- 게임 출시 정보 --\n");
printf(" 게임명 : %s\n", gameinfo1.name);
printf(" 발매년도 : %d\n", gameinfo1.year);
printf(" 가격 : %d\n", gameinfo1.price);
printf(" 제작사 : %s\n", gameinfo1.company);
// 구조체를 배열처럼 초기화
struct GameInfo gameinfo2 = { "너도게임",2017,100,"너도회사" };
// 구조체 출력
printf("-- 또다른 게임 출시 정보 --\n");
printf(" 게임명 : %s\n", gameinfo2.name);
printf(" 발매년도 : %d\n", gameinfo2.year);
printf(" 가격 : %d\n", gameinfo2.price);
printf(" 제작사 : %s\n", gameinfo2.company);
// 구조체 배열
struct GameInfo gameArray[2] = {
{ "나도게임",2017,50,"나도회사" },
{ "너도게임",2017,100,"너도회사" }
};
return 0;
}
구조체 변수는 struct라는 명령어를 사용하고 구조체 이름을 선언해서 사용하고 별칭을 지정해도 된다.
구조체 내부에는 구조체 멤버를 선언하고, 멤버 선언은 일반 변수 선언과 비슷하지만 초기화되지는 않는다.
그리고 구조체를 선언해야 실제 메모리가 할당된다.
구조체의 멤버를 초기화 하는 방법에는 두 가지가 있다.
{ } 괄호 안에 변수들을 선언한 차례대로 배열로 입력해주는 방법과,
구조체를 먼저 선언 후 '구조체명.변수명 = ~~~ ' 식으로 초기화하는 방법이 있다.
구조체를 배열로 만들어놓고 사용할 수도 있다. 위 예제 코드를 보면,
gameArray[0] = { "나도게임",2017,50,"나도회사" }이 되고
gameArray[1] = { "너도게임",2017,100,"너도회사" }이 된다.
// 구조체 포인터
struct GameInfo* gamePtr;
gamePtr = &gameinfo1;
printf("-- 미션맨의 게임 출시 정보 --\n");
printf(" 게임명 : %s\n", (* gamePtr).name);
printf(" 발매년도 : %d\n", gamePtr->year);
printf(" 가격 : %d\n", gamePtr->price);
printf(" 제작사 : %s\n", gamePtr->company);
포인터는 어떤 변수의 주소를 담고 가리키는 변수인데, 구조체 포인터도 마찬가지다.
구조체를 가리키는 포인터를 구조체 포인터라고 하는데 ' struct 구조체명 *포인터명 ' 으로 선언하면 된다.
위 예제 코드를 보면 (*gamePtr).name과 gamePtr->year 가 있다.
둘 다 같은 의미를 가지는데, 구조체포인터의 경우 -> 를 많이 쓴다.
위 코드에서는 이미 선언과 초기화가 되어있는 구조체 주소를 포인터 변수가 받았기 때문에 바로 출력하지만,
포인터변수를 통해 받은 주소의 구조체 멤버 변수들을 초기화하기 위해서는
gamePtr->name = "이름" , (*gamePtr).name = "이름" 이런 식으로 초기화하면 된다.
struct GameInfo {
char* name;
int year;
int price;
char* company;
struct GameInfo* friendGame; // 연관업체게임
};
gameinfo1.friendGame = &gameinfo2;
printf("\n\n-- 연관 업체의 게임 출시 정보 --\n");
printf(" 게임명 : %s\n", (*gameinfo1.friendGame).name);
printf(" 발매년도 : %d\n", gameinfo1.friendGame->year);
printf(" 가격 : %d\n", gameinfo1.friendGame->price);
printf(" 제작사 : %s\n", gameinfo1.friendGame->company);
위 예제 코드처럼 구조체 안에 포인터변수를 선언할 수도 있다 !
// typedef
// 자료형에 별명 지정
int i = 1;
typedef int 정수;
typedef float 실수;
정수 정수변수 = 3; // int i = 3;
실수 실수변수 = 3.23f; // float f = 3.23f;
typedef strucrt GameInfo 게임정보;
게임정보 game1;
game1.name = "한글게임";
game1.year = 2015;
typedef를 사용하면 변수를 선언, 초기화할 때 보다 편하게 할 수 있다.
구조체를 정의할 때 struct GameInfo를 일일이 써줄려면 얼마나 귀찮은가,,, struct GameInfo를 간단하게 ' 게임정보 ' 만 써서 구조체 선언이 가능하게 할 수 있다 !
'c언어 기초' 카테고리의 다른 글
c언어 동적 메모리 할당하는 이유 (0) | 2022.06.07 |
---|---|
c언어 구조체 프로젝트 struct project - 나도코딩 (0) | 2022.06.04 |
c언어 다차원배열 multidimensional array 프로젝트 카드뒤집기게임 - 나도코딩 (0) | 2022.06.02 |
c언어 다차원배열 multidimensional array - 나도코딩 (0) | 2022.05.31 |
c언어 포인터, pointer 프로젝트, 물고기 키우기 - 나도코딩 (0) | 2022.05.31 |