팔만코딩경
/
Library DB
/
C언어 기초문법(?)
/
C언어 11강. 구조체와 typedef
/
LIST
Search
Share
LIST
Gallery view
Search
•
개념
사용자가 정의하는 데이터 형식
쉽게 생각하면 우리가 성인이 되면 받는 주민등록증 처럼 주민등록번호, 이름, 주소, 발급일자 등을 입력 저장하는 역할을 한다고 생각하면 된다.
•
구성
필드 또는 멤버인 변수로 구성
단, void 형은 사용할 수 없다.
•
구조체 형식
struct
태그
{
멤버
;
}
;
C
복사
▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽
struct
POINT
{
int
x
;
int
y
;
}
;
C
복사
◦
태그 tag : 구조체 식별자, 구조체 형식 이름 대문자 사용(관례)
•
구조체 라는 것은 우리가 정의하는 데이터 형이라고 생각하면 된다.
데이터 형을 사용하기 위해서는 구조체 변수를 선언을 해야한다.
•
구조체 선언1
◦
일반 변수 선언과 동일
struct
POINT
{
int
x
;
int
y
;
}
;
C
복사
struct POINT point;
struct POINT
point[3], *ppoint;
데이터형
•
구조체 선언2
◦
구조체 정의와 변수 선언을 동시에 하는경우
struct
POINT
{
int
x
;
int
y
;
}
point
,
*
ppoint
,
PointArray
[
3
]
;
point
.
x
=
10
;
point
.
y
=
20
;
// 등...
C
복사
•
멤버 접근 연산자 : . , ->
◦
변수 선언인 경우 (' . ' dot 사용)
struct
POINT
point
;
point
.
x
=
20
;
point
.
y
=
10
;
C
복사
◦
포인터 선언인 경우(' -> ' 사용)
struct
POINT
*
ppoint
,
point
;
ppoint
-
&
point
;
ppoint
->
x
=
10
;
ppoint
->
y
=
20
;
C
복사
•
다양한 구조체 변수 선언
struct
POINT
point
;
struct
POINT
*
ppoint
;
struct
POINT
pointXY
[
3
]
;
pintXY
[
0
]
.
x
=
10
;
pintXY
[
0
]
.
x
=
20
;
pintXY
[
1
]
.
x
=
30
;
// 등
// 일반 변수와 동일하게 사용 및 선언
C
복사
구조체
•
역할
C 언어에서 정의된 기존 형식(int, char, ...) 이나 사용자 정의 형식(struct)을 보다 짧게 또는 의미있는 형식으로 재정의 한 것
•
형식
typedef
// 기존 데이터형 새로운 데이터형;
typedef
int
INT
;
typedef
unsigned
int
UNIT
;
typedef
struct_POINT POINT
;
C
복사
•
typedef 사용예(1) : 기존 데이터형
#
include
<stdio.h>
#
include
<stdlib.h>
typedef
int
INT
;
typedef
unsigned
int
UINT
;
int
main
(
void
)
{
INT var1
=
-
7
;
UINT var2
=
12
;
printf
(
"%d %d\n"
,
var1
,
var2
)
;
return
0
;
}
C
복사
•
typedef 사용예(2) : 사용자 정의 데이터형(1)
#
include
<stdio.h>
#
include
<stdlib.h>
typedef
struct
_POINT
{
int
x
;
int
y
;
}
POINT
;
int
main
(
void
)
{
POINT Test
;
Test
.
x
=
10
;
Test
.
y
=
20
;
printf
(
"%d %d\n"
,
Test
.
x
,
Test
.
y
)
;
return
0
;
}
C
복사
구조체 사용 예
•
일반 변수로 사용하는 형태
#
include
<stdio.h>
#
include
<stdlib.h>
typedef
struct
_POINTP
{
int
x
;
int
y
;
}
POINT
;
int
main
(
void
)
{
POINT point1
;
point1
.
x
=
10
;
point1
.
y
=
20
;
printf
(
"%d %d %ld\n"
,
point1
.
x
,
point1
.
y
,
sizeof
(
point1
)
)
;
return
0
;
}
C
복사
•
포인터 변수로 사용하는 형태
// 포인터 변수로 사용하는 형태
#
include
<stdio.h>
#
include
<stdlib.h>
typedef
struct
_POINTP
{
int
x
;
int
y
;
}
POINT
;
int
main
(
void
)
{
POINT point1
,
*
ppoint
;
point1
.
x
=
10
;
point1
.
y
=
20
;
ppoint
=
&
point1
;
printf
(
"%d %d %ld\n"
,
ppoint
->
x
,
ppoint
->
y
,
sizeof
(
ppoint
)
)
;
ppoint
=
(
POINT
*
)
malloc
(
sizeof
(
POINT
)
*
2
)
;
ppoint
[
0
]
.
x
=
10
;
ppoint
[
0
]
.
y
=
20
;
ppoint
[
1
]
.
x
=
100
;
ppoint
[
1
]
.
y
=
200
;
printf
(
"%d %d %d %d\n"
,
ppoint
[
0
]
.
x
,
ppoint
[
0
]
.
y
,
ppoint
[
1
]
.
x
,
ppoint
[
1
]
.
y
)
;
free
(
ppoint
)
;
return
0
;
}
C
복사
◦
포인터로 사용시에 배열로 사용사는게 더 가독성이 좋다고 생각하고 배열형태로 사용하는걸 권장한다.
•
함수의 매개변수로 사용하는 형태
// 함수의 매개변수로 사용하는 형태
#
include
<stdio.h>
#
include
<stdlib.h>
typedef
struct
_POINT
{
int
x
;
int
y
;
}
POINT
;
void
func1
(
POINT spoint
)
{
printf
(
"%d %d\n"
,
spoint
.
x
,
spoint
.
y
)
;
}
void
func2
(
POINT
*
ppoint
)
{
ppoint
->
x
+=
1
;
ppoint
->
y
+=
1
;
}
void
func3
(
POINT pointarray
[
]
,
int
count
)
{
int
i
;
for
(
i
=
0
;
i
<
count
;
i
++
)
{
++
pointarray
[
i
]
.
x
;
++
pointarray
[
i
]
.
y
;
}
}
int
main
(
void
)
{
int
i
;
POINT spoint
=
{
10
,
20
}
;
POINT spointarray
[
]
=
{
{
10
,
20
}
,
{
30
,
40
}
}
;
func1
(
spoint
)
;
func2
(
&
spoint
)
;
printf
(
"%d %d\n"
,
spoint
.
x
,
spoint
.
y
)
;
func3
(
spointarray
,
2
)
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
printf
(
"%d %d "
,
spointarray
[
i
]
.
x
,
spointarray
[
i
]
.
y
)
;
}
putchar
(
'\n'
)
;
return
0
;
}
C
복사
typedef