구조체도 기본 자료형처럼 쓰고 싶습니다.
변수를 선언 할 때, struct 키워드를 빼고 자료형만 적고 싶은데 어떻게 해야할까요?
typedef
type definition의 약자. 이미 정의되어 있는 자료형에 새로운 별명을 지어줍니다. ex) 선생님을 쌤, …
Ex090201) typedef 1
아래 소스코드를 따라서 작성해봅시다.
// Main.c
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
int main(void)
{
Date_t Birthday;
return 0;
}
size_t 자료형도 사실 typedef unsigned long long size_t
_t가 접미사로 붙으면 typedef 되었다고 보면 됩니다.
Ex090204) 초기화 방법
아래 소스코드를 따라서 작성해봅시다.
// Main.c
typedef struct Date
{
int Year;
int Month;
int Day;
} Date_t;
int main(void)
{
Date_t Today = { 0, };
/* 첫 번째 방법. */
Date_t Tomorrow = { 7, 7, 2021 };
/* 두 번째 방법. 요소 나열법. 실수할 여지가 있으니 사용에 주의합시다. */
/* 나중에 누가 일,월,년 순으로 구조체 멤버변수 순서를 바꿔버리면 문제가 생길 수도 있습니다. */
/* const 멤버 변수를 선언해서 사용할때도 요소 나열법이 유용합니다. */
return 0;
}
Ex090205) typedef와 함수 매개변수 자료형
아래 소스코드를 따라서 작성해봅시다. 따라서 작성한 소스코드의 출력을 예측해봅시다. 예측한 결과와 실행한 결과를 비교해봅시다.
// Main.c
#include <stdio.h>
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
void IncreaseYear(Date_t InDate);
int main(void)
{
Date_t Today;
Today.Year = 2021;
Today.Month = 5;
Today.Day = 26;
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
IncreaseYear(Today);
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
return 0;
}
void IncreaseYear(Date_t InDate)
{
printf("IncreaseYear() has been called.\\n");
++InDate.Year;
return;
}
IncreaseYear 함수에서 ++InDate.Year; 코드를 사용해
Date_t 구조체의 Year변수에 1을 증가 시키지만
이건 Today의 값을 복사해 온 InDate 매개변수의 Year값을 변화 시킨것
그래서 원래 Today의 변수에 저장된 값은 변화가 없다.
Ex090206) pointer to structure
구조체도 포인터 자료형이 가능합니다.
아래 소스코드를 따라서 작성해봅시다. 따라서 작성한 소스코드의 출력을 예측해봅시다. 예측한 결과와 실행한 결과를 비교해봅시다.
// Main.c
#include <stdio.h>
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
void IncreaseYear(Date_t* InPtrToDate);
int main(void)
{
Date_t Today;
Today.Year = 2021;
Today.Month = 5;
Today.Day = 26;
Date_t* PtrToToday = &Today;
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
IncreaseYear(PtrToToday);
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
return 0;
}
void IncreaseYear(Date_t* InPtrToDate)
{
printf("IncreaseYear() has been called.\\n");
++(*InPtrToDate).Year;
return;
}
또다른 구조체 멤버 접근 연산자 ->
구조체 포인터에 역참조 연산자와 . 연산자를 합친 연산자가 -> 연산자. 우선순위도 1순위인 연산자라서 괄호 안쳐도 됩니다.
Ex090207) -> 연산자
아래 소스코드를 따라서 작성해봅시다. 따라서 작성한 소스코드의 출력을 예측해봅시다. 예측한 결과와 실행한 결과를 비교해봅시다.
// Main.c
#include <stdio.h>
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
void IncreaseYear(Date_t* InPtrToDate);
int main(void)
{
Date_t Today;
Today.Year = 2021;
Today.Month = 5;
Today.Day = 26;
Date_t* PtrToToday = &Today;
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
IncreaseYear(PtrToToday);
printf("%d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
return 0;
}
void IncreaseYear(Date_t* InPtrToDate)
{
printf("IncreaseYear() has been called.\\n");
//++(*InPtrToDate).Year;
++InPtrToDate->Year;
return;
}
[어려움]Ex090208) 여러 개의 반환 값
구조체를 함수 반환 자료형으로 쓰면 실질적으론 여러개의 값 반환 가능합니다.
아래 소스코드를 따라서 작성해봅시다. 따라서 작성한 소스코드의 출력을 예측해봅시다. 예측한 결과와 실행한 결과를 비교해봅시다.
// Main.c
#include <stdio.h>
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
Date_t GetToday(void);
int main(void)
{
Date_t Today = { 0, };
printf("Today: %d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
Today = GetToday();
printf("Today: %d/%d/%d\\n", Today.Year, Today.Month, Today.Day);
return 0;
}
Date_t GetToday(void)
{
printf("GetToday() has been called.\\n");
Date_t Date;
Date.Year = 2020;
Date.Month = 7;
Date.Day = 7;
return Date;
}
Ex090209) 구조체 배열
아래 소스코드를 따라서 작성해봅시다. 따라서 작성한 소스코드의 출력을 예측해봅시다. 예측한 결과와 실행한 결과를 비교해봅시다.
// Main.c
#include <stdio.h>
struct Date
{
int Year;
int Month;
int Day;
};
typedef struct Date Date_t;
int main(void)
{
Date_t Anniversaries[3];
size_t i, ElementSize;
Anniversaries[0].Year = 2000;
Anniversaries[0].Month = 1;
Anniversaries[0].Day = 1;
Anniversaries[1].Year = 2010;
Anniversaries[1].Month = 10;
Anniversaries[1].Day = 10;
Anniversaries[2].Year = 2020;
Anniversaries[2].Month = 20;
Anniversaries[2].Day = 20;
for (i = 0; i < 3; ++i)
{
printf("anniversaries[%zu]: %d/%d/%d\\n", i, Anniversaries[i].Year,
Anniversaries[i].Month,
Anniversaries[i].Day);
}
printf("sizeof(anniversaries[0]): %zu\\n", sizeof(Anniversaries[0]));
return 0;
}
'C' 카테고리의 다른 글
| [내배캠자습]C언어 챕터 9-4 : enum (0) | 2026.03.29 |
|---|---|
| [내배캠자습]C언어 챕터 9-3 : 구조체와 클래스 (0) | 2026.03.29 |
| [내배캠자습]C언어 챕터 9-1 : 구조체 (0) | 2026.03.29 |
| [내배캠자습]C언어 챕터 8-2 : 동적할당과 메모리 소유권 문제 (0) | 2026.03.29 |
| [내배캠자습]C언어 챕터 8-1 : 힙 메모리 (0) | 2026.03.29 |