C 구조체
C 언어의 구조체에 대해 정리한다.
. 하나 이상의 변수(정수형, 실수형, 포인터, 배열 등)을 묶어 새로운 자료형을 정의
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
32
33
34
35
36
37
...
struct person
{
char name[20];
char phonenum[20];
int age;
};
typedef struct point
{
int pos_x;
int pos_y;
}Point;
...
int main(void)
{
// 구조체 변수 선언 방법: struct type_name val_name;
struct person p1;
// 초기화 방법1, 문자열, 정수형을 바로 대입할 수 있음
struct person p2 = {"김철수", "010-1111-2222", 20};
struct person p3;
Point pos1;
// 초기화 방법2, 배열에 문자열을 입력하기 위해 strcpy 함수를 사용함
strcpy(p1.name, "홍길동");
strcpy(p1.phonenum, "010-1234-5678");
p1.age = 10; // 구조체 변수 p1의 멤버변수 age에 20을 저장
// 구조체 변수 멤버 변수 접근 방법
printf("이름 입력:"); scanf("%s", p3.name); // 배열 멤버변수는 이름(=주소값) 접근
printf("나이 입력:"); scanf("%d", &p3.age); // 정수형 멤버변수는 주소값 접근
return 0;
}
구조체 배열 및 포인터
구조체 배열
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
struct point
{
int pos_x;
int pos_y;
};
...
int main(void)
{
struct point arr[4];
struct point arr1[3] = { // 초기화 방법
{1,2},
{3,4}
};
....
}
구조체 포인터
1
2
3
4
5
6
7
8
...
strcut point pos = {10,20};
struct point * pptr = &pos; // 포인터 변수 pptr이 구조체 변수 pos를 가리킴
// pptr이 가리키는 구조체 변수의 멤버에 값 저장
pptr->pos_x = 30; // (*pptr).pos_x = 30;
pptr->pos_y = 40; // (*pptr).pos_y = 40;
...
. 포인터 변수를 구조체의 멤버로도 선언 가능함
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
#include <stdio.h>
struct point
{
int pos_x;
int pos_y;
};
struct circle
{
double radius;
struct point * center;
};
int main()
{
struct point cen = {2, 6};
double rad = 2.5;
struct circle ring = {rad, &cen}; // point형 구조체 변수 center의 주소값
printf("원의 반지름은: %g \n", ring.radius);
printf("원의 중심은: %d %d \n", ring.center->pos_x, ring.center->pos_y);
return 0;
}
함수의 인자로 전달되는 구조체
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
32
33
34
35
36
37
38
39
40
#include <stdio.h>
typedef struct point
{
int pos_x;
int pos_y;
}Point;
// 구조체 변수의 call by value
void ShowPosition(Point pos)
{
printf("< %d %d > \n", pos.pos_x, pos.pos_y );
}
Point CurrentPosition(void)
{
Point cen;
Printf("Input current pos: ");
scanf("%d %d", &cen.pos_x, &cen.pos_y);
return cen;
}
// 구조체 변수의 call by reference
void SymmetryPosition(Point * ptr)
{
ptr->pos_x = (ptr->pos_x) * -1;
ptr->pos_y = (ptr->pos_y) * -1;
}
int main()
{
Point curPos = CurrentPosition();
ShowPosition(CurPos); // 구조체 복사
SymmetryPosition(&curPos); // curPos 구조체의 멤버변수 조작을 위한 주소 전달
ShowPosition(curPos); // 구조체 복사
return 0;
}
. 구조체 변수를 대상으로 대입연산, 주소값 반환(&) 연산, 구조체 변수 크기 반환(sizeof) 연산 등이 허용
. 사칙연산은 별도의 함수를 정의하여 수행해야함
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
#include <stdio.h>
typedef struct point
{
int pos_x;
int pos_y;
}Point;
Point AddPosition(Point pos1, Point pos2)
{
Point pos = {pos1.pos_x + pos2.pos_x, pos1.pos_y + pos2.pos_y};
return pos;
}
int main()
{
Point pos1 = { 1, 2 };
Point pos2 = { 3, 4 };
Point result;
result = AddPosition(pos1, pos2);
printf("<X: %2d Y: %2d >\n", result.pos_x, result.pos_y);
return 0;
}
구조체 중첩
. 구조체의 멤버변수로 구조체 선언 가능
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
#include <stdio.h>
typedef struct point
{
int pos_x;
int pos_y;
}Point;
typedef struct circle
{
Point cen;
double rad;
}Circle;
void ShowCircleInfo(Circle * cptr)
{
printf("[ %d %d ] \n", (cptr->cen).pos_x, (cptr->cen).pos_y);
printf("radius: %g \n\n", cptr->rad);
}
int main()
{
Circle c1 = {`{1, 2}`, 2.5};
Circle c2 = {3, 4, 5.5};
ShowCircleInfo(&c1);
ShowCircleInfo(&c2);
return 0;
}
공용체(union)
. 공용체를 구성하는 멤버변수 중, 데이터형의 크기가 (메모리 차지 공간) 가장 큰 데이텨형 만큼의 메모리 공간 사용
. 할당된 메모리 공간을 멤버변수들이 공유하게 됨
. 데이터형의 메모리 공간에 얽매이지 않는 접근방식을 제공하기 위함
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
#include <stdio.h>
typedef struct dbshort
{
unsigned short upper; // 2byte
unsigned short lower; // 2byte
} DBShort;
typedef union rdbuf
{
int iBuf; // 4byte
char bBuf[4]; // 4byte
DBShort sBuf; // 4byte
} RDBuf;
int main(void)
{
RDBuf buf;
printf("정수 입력: "); scanf("%d", &(buf.iBuf));
printf(" 상위 2바이트: %u \n ", buf.sBuf.upper);
printf(" 하위 2바이트: %u \n ", buf.sBuf.lower);
printf(" 상위 1바이트 아스키 코드: %c \n ", buf.bBuf[0]);
printf(" 상위 1바이트 아스키 코드: %c \n ", buf.bBuf[3]);
return 0;
}
열거형(enum)
. 저장이 가능 한 값 자체를 정수의 형태로 선언하여 사용
. 반복되는 정해진 상수에 대해 프로그램 가독성을 높이기 위해 종종 사용됨
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
#include <stdio.h>
typedef enum scale
{
Do = 1, Re = 2, Mi = 3
} Scale;
void Sound(Scale a)
{
switch(a)
{
case Do:
puts("도");
return;
case Re:
puts("레");
return;
case Mi:
puts("미");
return;
}
}
int main(void)
{
Scale tone;
// for(tone = 1; tone <= 3; tone += 1)
for(tone = Do; tone <= Mi; tone += 1)
Sound(tone);
return 0;
}