1. 구조체
정의
- 구조체는 서로 관련 있는 여러 자료형의 변수들을 묶어서 만든 새로운 자료형이다.
- 구조체는 main() 함수 위의 전역 위치에 다음 형식으로 정의한다.
struct 구조체명 { 자료형1 변수명1; 자료형2 변수명2; 자료형3 변수명3; . . . }; |
3. C언어에 내장된 int, float, double, char 등 기본 자료형과 달리 구조체는 이름과 멤버를 사용자가 직접 정의할 수 있기 때문에 사용자 정의 자료형(UDT, User-defined Data Type) 이라고 한다.
선언
1. 정의된 구조체를 사용하려면 구조체 변수를 선언해야한다. 구조체 변수는 배열처럼 중괄호를 사용해 한꺼번에 값을 초기화 할 수 있다.
struct 구조체명 구조체변수명 = { 값1, 값2, ... }; |
2. 구조체 멤버에는 마침표(.)를 사용해 변수명, 멤버명과 같은 형식으로 접근한다.
변수명.멤버명 = 값; |
3. 구조체도 배열처럼 중괄호를 사용해 값을 한꺼번에 초기화 할 수 있다.
2. 구조체 배열과 구조체 포인터
- 일반 배열과 마찬가지로 구조체 배열도 만들 수 있다.
struct 구조체명 배열명[배열크기]; |
2. 구조체 포인터는 (*구조체변수명) .멤버 또는 구조체변수명 -> 멤버와 같은 형식으로 값에 접근할 수 있다.
struct 구조체명 * 변수명; |
일반적으로 포인터 변수가 가리키는 int형 변수의 값을 나타낼 때 포인터 변수 앞에 별표를 붙여 *ptr로 작성한다.
prt은 int형 변수의 주소를 담고 있는데, 그 앞에 별표를 붙임으로써 가리키는 주소에 저장된 값을 나타낸다.
구조체 포인터도 똑같다.
구조체 포인터가 가리키는 구조체 변수의 값을 나타내려면 gamePtr 앞에 별표를 붙여 *gamePtr로 쓰면 된다.
그런데 이때 컴퓨터는 *gamePtr.name을 gameInfo.name 으로 인식하지못하고 *(gamePtr.name)으로 해석하기 때문에
*gamePtr이 우선순위에서 먼저 인식되도록 (*gamePtr) 처럼 소괄호 처리를 해야한다.
화살표 -> 를 사용하는 방법도 있다.
gamePtr -> name 은
(*gamePtr).name 과 같은 의미가 된다.
3. 구조체 안의 구조체
앞에서 정의한 GameInfo 구조체의 마지막 멤버로 friendGame을 추가로 선언한다.
friendGame은 구조체 GameInfo의 구조체 변수를 가리키는 구조체 포인터로, 구조체 안에 있는 또 다른 구조체를 가리키는 역할을 한다.
4. typedef
- typedef 키워드는 이미 존재하는 자료형에 새로운 이름(별명)을 붙이는 데 사용하며, 다음과 같은 형식으로 구조체를 정의한다.
typedef struct { 자료형1 변수명1; 자료형2 변수명2; 자료형3 변수명3; . . . } 구조체명; |
2. typedef로 정의한 구조체를 사용하려면 다음과 같이 구조체 변수를 선언해야 한다.
구조체명 구조체변수명; |
셀프체크
의문점
// 대출 여부 출력 에서
if (books[i].available == 1) 이라고 안 쓰는 이유?
어려운 구조체......
'Programming Language > C' 카테고리의 다른 글
[나도코딩] 10장.파일에 데이터 저장하기 : 파일 입출력 (0) | 2023.04.02 |
---|---|
[나도코딩] 8장. 배열에 배열 더하기 : 다차원 배열 (0) | 2023.04.01 |
[나도코딩] 7장.메모리 주소 관리하기 : 포인터 (0) | 2023.03.19 |
[나도코딩] 6장.여러 데이터 한번에 저장하기 : 배열과 문자열 (0) | 2023.03.14 |
[나도코딩] 5장.같은 일 한곳에서 처리하기 : 함수 (0) | 2023.03.13 |