Develop
2003.04.23 10:57
[c] 구조체의 설명과 예제..
조회 수 8403 댓글 0
구조체 : 서로 관련있으면서 다른 이름과 데이타 타입을 갖는 요소들을 모아놓은 것.
다른 프로그래밍 언어에서는 레코드라고도 한다.
구조체의 장점
1. 서로 연관된 데이터들을 묶어서 하나의 단위로 취급할 수 있다.
2. 구조체 대입 (structure assignment) 이 가능하다.
3. 함수의 parameter 로서 구조체를 통째로 건네줄 수도 있고, 함수의 리턴값으로 구조체를 통째로
리턴받을 수도 있다.
구조체의 예
다음 문장은
struct complex {
double real;
double imag;
};
struct complex x, y;
아래와 같은 의미이다.
struct complex {
double real;
double imag;
} x, y;
다음은 잘못된 구조체 선언이다.
struct S {
int a;
struct S next;
};
다음은 올바른 구조체 선언이다.
struct S {
int a;
struct S *next;
};
관련 연산자
멤버 연산자('.')
구조체 안에는 여러 개의 멤버가 있을 수 있다. 그리고, 그 멤버의 종류는 C 의 자료형이면
어느 것이든지 상관없다. 그리고 그러한 멤버들을 참조할 수 있도록 해 주는 연산자가 바로
멤버 연산자이다. 만일 name 이 구조체명이고 member 는 구조 템플릿에 기술된 멤버라면,
name.member
는 구조체의 멤버를 나타낸다. 멤버 연산자는 나중에 배울 유니언에 대해서도 같은 방식으로
사용된다. 다음의 예는 구조체 item 의 멤버 code 에 값을 대입하는 것이다.
struct {
int code;
float cost;
} item;
item.code = 1212;
간접 멤버 연산자('->')
이 연산자는 구조체나 유니언의 구성원을 식별하기 위해서 구조체나 유니언에 대한
포인터와 함께 사용된다. ptrstr 이 구조체에 대한 포인터이고, member 가 구조체 템플릿에
기술된 멤버라면,
ptrstr->member
는 포인터가 가리키는 구조체의 구성원임을 나타낸다. 간접 구성원 연산자는 유니언에
대해서도 같은 방식으로 사용된다.
struct {
int code;
float cost;
} item, *ptrstr;
ptrstr = &item;
ptrstr->code = 3434;
이것은 구조체 item 의 구성원 code 에 값을 대입한다. 다음 세 연산식은 모두 동일하다.
ptrstr->code item.code (*ptrstr).code
예제: simplestruct.c
1 #include <stdio.h>
2
3 struct complex {
4 int real;
5 int imag;
6 };
7
8 main() {
9 struct complex a = { 3, 4 }, b, *c;
10
11 printf("&a = %p t a.real = %d t a.imag = %dn", &a, a.real, a.imag);
12 printf("&a.real = %p t &a.imag = %p nn", &a.real, &a.imag);
13
14 b = a;
15 a.real = 5;
16 a.imag = 6;
17 printf("&b = %p t b.real = %d t b.imag = %dn", &b, b.real, b.imag);
18 printf("&b.real = %p t &b.imag = %p nn", &b.real, &b.imag);
19
20 c = &a;
21 a.real = 7;
22 a.imag = 8;
23 printf("c = %p t c->real = %d t c->imag = %dn", c, c->real, c->imag);
24 }
#49 enterprise:/data1/student/c9844000% a.out
&a = effff9e4 a.real = 3 a.imag = 4
&a.real = effff9e4 &a.imag = effff9e8
&b = effff9dc b.real = 3 b.imag = 4
&b.real = effff9dc &b.imag = effff9e0
c = effff9e4 c->real = 7 c->imag = 8
중첩된 struct
struct S {
struct T { int a, b; } x;
};
struct S a;
a.x.a = 10;
a.x.b = 20;
예제: nestedstruct.c
1 #include <stdio.h>
2
3 main() {
4 struct S {
5 struct T {
6 int a;
7 int b;
8 } x;
9 int y;
10 };
11
12 struct S a = { { 10, 20}, 30 };
13
14 printf("a.x.a = %dn", a.x.a);
15 printf("a.x.b = %dn", a.x.b);
16 printf("a.y = %dn", a.y);
17 }
#5 enterprise:/data1/student/c9844000% a.out
a.x.a = 10
a.x.b = 20
a.y = 30
struct의 각 컴포넌트의 포인터
struct vector3 {
int x;
int y;
int z;
} s;
int *p, *q, *r;
....
p = &s.x;
q = &s.y;
r = &s.z;
구조체와 함수
예제: passing_struct.c
1 #include <stdio.h>
2
3 struct da {
4 int x,y,z;
5 };
6
7 int total ( struct da tot ) {
8 return ( tot.x + tot.y + tot.z );
9 }
10
11 main() {
12 struct da val = { 10, 30, 50 };
13 int sum = 0;
14 sum = total ( val );
15 printf("Sum = %dn",sum);
16 }
#62 enterprise:/data1/student/c9844000% a.out
Sum = 90
예제: passing_pointer.c
1 #include <stdio.h>
2
3 struct da {
4 int x, y, z;
5 };
6
7 int total ( struct da *tot) {
8 return ( tot->x + tot->y + tot->z );
9 }
10
11 void main(void) {
12 struct da val = { 10, 30, 50 };
13 int sum = 0;
14 sum = total (&val);
15 printf("Sum = %dn",sum);
16 }
#65 enterprise:/data1/student/c9844000% a.out
Sum = 90
구조체 크기
예제: struct_size1.c
1 #include <stdio.h>
2
3 main() {
4 struct S {
5 char c1;
6 char c2;
7 };
8
9 struct S a;
10
11 printf("sizeof(S) = %dn", sizeof(a));
12 }
#89 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 2
예제: struct_size2.c
1 #include <stdio.h>
2
3 main() {
4 struct S {
5 char c1;
6 char c2;
7 int a;
8 };
9
10 struct S a;
11
12 printf("sizeof(S) = %dn", sizeof(a));
13 printf("&a.c1 = %p n", &a.c1);
14 printf("&a.c2 = %p n", &a.c2);
15 printf("&a.a = %p n", &a.a);
16 }
#95 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 8
&a.c1 = effff9e4
&a.c2 = effff9e5
&a.a = effff9e8
예제: struct_size.c
1 #include <stdio.h>
2
3 main() {
4 struct S {
5 char c1;
6 char c2;
7 int value[5];
8 };
9
10 struct S a;
11
12 printf("sizeof(S) = %dn", sizeof(a));
13 }
#71 enterprise:/data1/student/c9844000% a.out
sizeof(S) = 24
student.c
1 #include <stdio.h>
2
3 struct student {
4 char name[20];
5 int age;
6 int year;
7 struct student * next;
8 };
9
10 main() {
11 struct student a, *p, *i;
12
13 strcpy(a.name, "Hong Gil Dong");
14 a.age = 22;
15 a.year = 1;
16 a.next = NULL;
17
18 p = (struct student *) malloc(sizeof(struct student));
19 strcpy(p->name, "Lee Soong Sil");
20 p->age = 22;
21 p->year = 1;
22 p->next = NULL;
23
24 a.next = p;
25 i = &a;
26
27 while(i != NULL) {
28 printf("i->name :%sn", i->name);
29 printf("i->age :%dn", i->age);
30 printf("i->year :%dn", i->year);
31 i = i->next;
32 printf("n");
33 }
34 }
#33 enterprise:/data1/student/c9844000% a.out
i->name :Hong Gil Dong
i->age :22
i->year :1
i->name :Lee Soong Sil
i->age :22
i->year :1
예제: dynamic_student.c
1 #include <stdio.h>
2
3 struct student {
4 char name[50];
5 int age;
6 int year;
7 struct student * next;
8 };
9
10 main() {
11 struct student *p, *head, *temp;
12 char name[50], end;
13 int age, year;
14
15 head = p = temp = NULL;
16 while(1) {
17 printf("put name:");
18 gets(name);
19 printf("put age:");
20 scanf("%d", &age);
21 printf("put year:");
22 scanf("%d", &year);
23 temp = (struct student *) malloc(sizeof(struct student));
24 if(head == NULL) {
25 head = temp;
26 p = temp;
27 } else {
28 p->next = temp;
29 }
30 strcpy(temp->name, name);
31 temp->age = age;
32 temp->year = year;
33 temp->next = NULL;
34
35 getchar();
36 printf("Do you want more data ? (Y/N):");
37 end = getchar();
38
39 if(end == 'N' || end == 'n')
40 break;
41 }
42
43 temp = head;
44 printf("nn=====================================n");
45 while(temp) {
46 printf("temp->name :%sn", temp->name);
47 printf("temp->age :%dn", temp->age);
48 printf("temp->year :%dn", temp->year);
49 temp = temp->next;
50 printf("n");
51 }
52 }
#165 enterprise:/data1/student/c9844000% a.out
put name:Son Oh Gong
put age:22
put year:1
Do you want more data ? (Y/N):
put name:Sa Oh Jung
put age:21
put year:1
Do you want more data ? (Y/N):n
=====================================
temp->name :Son Oh Gong
temp->age :22
temp->year :1
temp->name :Sa Oh Jung
temp->age :21
temp->year :1
공용체(UNION)
union name {
type name;
type name;
};
1 #include <stdio.h>
2 #define AGE 1
3 #define YEAR 2
4
5 union Information {
6 int age;
7 int year;
8 };
9
10 struct student {
11 char name[20];
12 int infortype;
13 union Information value;
14 struct student * next;
15 };
16
17 main() {
18 struct student lee, *p, *i;
19
20 lee.infortype = AGE;
21 strcpy(lee.name, "Lee Soong Sil");
22 lee.value.age = 22;
23 lee.next = NULL;
24
25 p = (struct student *)malloc(sizeof(struct student));
26 strcpy(p->name, "Hong Gil Dong");
27 p->infortype = AGE;
28 p->value.age = 22;
29 p->next = NULL;
30 lee.next = p;
31 i = p;
32
33 p = (struct student *)malloc(sizeof(struct student));
34 p->infortype = YEAR;
35 strcpy(p->name, "Sa Oh Jung");
36 p->value.year = 1;
37 p->next = NULL;
38 i->next = p;
39
40 i = &lee;
41 while(i) {
42 printf("i->name : %sn", i->name);
43 if(i->infortype == AGE)
44 printf("i->value(age) : %dn", i->value.age);
45 else if(i->infortype == YEAR)
46 printf("i->value(year) : %dn", i->value.year);
47 else
48 printf("Invalid data typen");
49
50 printf("n");
51 i = i->next;
52 }
53 }
#53 enterprise:/data1/student/c9844000% a.out
i->name : Lee Soong Sil
i->value(age) : 22
i->name : Hong Gil Dong
i->value(age) : 22
i->name : Sa Oh Jung
i->value(year) : 1
번호 | 분류 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|---|
177 | System/OS | [windows] 여러가지 활용 팁 | hooni | 2003.04.23 | 20041 |
176 | Develop |
[c] AES 알고리즘 (암호화/복호화)
![]() |
hooni | 2003.04.23 | 20151 |
175 | Develop |
[c] UTF-8을 EUC-KR로 변환.. (iconv)
![]() |
hooni | 2013.04.23 | 20211 |
174 | Develop | [ios] UIView에서 상위 UIViewController 가져오기 | hooni | 2013.09.27 | 20259 |
173 | System/OS |
[linux] 꿀통(honeyd) 설치하기.. 메뉴얼 과정
6 ![]() |
hooni | 2006.04.23 | 20307 |
172 | Develop | [php] substr() 한글 자를 때 깨짐 방지 | hooni | 2014.01.09 | 20445 |
171 | Develop | [android] [번역] 안드로이드 Android Cloud to Device Messaging(C2DM) | hooni | 2013.04.23 | 20490 |
170 | Develop |
[opengl] 컴퓨터 그래픽스 강의 자료(수업자료)
![]() |
hooni | 2003.04.23 | 20527 |
169 | System/OS | asx미디어 정보 기록.. | hooni | 2003.04.23 | 20609 |
168 | Etc | [web] 제로보드 XE 템플릿에서 if문에 대해서 알아봅시다 | hooni | 2013.08.16 | 20621 |
167 | Develop | [c++] 디렉토리 내의 파일 찾기 FindFirstFile() 함수 6 | hooni | 2013.04.23 | 20667 |
166 | Develop | git 브런치 배우기 (링크) | hooni | 2013.07.09 | 20702 |