8.구조체
- 구조체란? : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것 : 관련 있는 데이터를 하나의 자료형으로 묶을 경우, 관리하기가 편리해지고, 프로그램의 코드도 한결 간결해진다.
|
>사용자 정의 자료형 :기본 자료형 변수를 묶어서 새로운 자료형을 만드는 것. - 형식 struct point // point라는 이름의 구조체 선언 { int x; // 구조체 멤버 int x; int y; // 구조체 멤버 int y; }; :point라는 이름의 구조체를 정의합니다. 이 구조체는 int형 변수 x와 y로 이뤄져있습니다.
+구조체 정의와 구조체 변수의 선언을 동시에 하기 -형식 struct point { int x; int y; } p1, p2, p3; :point라는 구조체를 정의하고 구조체 변수 p1,p2,p3를 선언하는 방법을 보여주고 있다.
+구조체의 정의와 구조체 변수의 선언의 분리 ex) struct point { int x; int y; };
int main(void) { struct point p1,p2,p3; ........... return 0; }
+구조체 변수로의 접근 :구조체 변수 내에 존재하는 멤버에 접근을 한다 : '.'연산자 - 멤버 연산자, 멤버 접근 연산자 ex) struct point { int x; int y; };
int main(void) { struct point p1; p1.x = 10; // p1의 멤버 x에 10을 대입 p1.y = 20; // p1의 멤버 y에 20을 대입 ... return 0; }
+구조체 변수의 초기화 ex1) struct person { char name[20]; char phone[20]; int age; };
int main(void) { struct person p = {"HUSL", "01-0101-0101", 20}; ..... return 0; }
ex2) - 구조체 변수 멤버를 지정하여 초기화하기(순서 중요 x) struct person { char name[20]; char phone[20]; int age; };
int main(void) { struct person p = {.age=20, .name="HUSL", .phone="0101-0101"}; ... return 0; }
>구조체와 배열 그리고 포인터 ex1) struct person { char name[20]; char phone[20]; int age; };
int main(void) { struct person pArray[10]; ..... return 0; }
ex2) - 구조체 배열의 초기화 struct person { char name[20]; char phone[20]; };
int main(void) { struct person pArray[3]= { {"Lee","333"}, {"kim","555"}, {"SES","777"} }; ... return 0; }
>구조체 포인터 : 구조체 포인터를 선언하여 구조체 변수를 가리킨다 ex) #include<stdio.h>
struct person { char name[20]; char phone[20]; };
int main(void) { struct person man = {"Thomas", "123-4567"}; struct person* pMan; pMan = &man; //구조체 변수를 이용한 출력 printf("name :%s\n",man.name); printf("phone :%s\n",man.phone);
//구조체 포인터를 이용한 출력 1 printf("name :%s\n",(*pMan).name); // pMan포인터가 가리키는 구조체변수 내에 존재하는 변수 name에 접근 printf("phone :%s\n",(*pMan).phone);
//구조체 포인터를 이용한 출력 2 printf("name :%s\n", pMan->name); printf("phone :%s\n", pMan->phone); // -> 간접 멤머 접근 연산자
return 0; }
: 구조체의 멤버로 포인터 변수가 선언되는 경우 ex) #include<stdio.h>
struct perInfo { char addr[30]; char tel[20]; }; struct person { char name[20]; char pID[20]; struct perInfo* info; };
int main(void) { struct perInfo info = {"Korea Seoul", "333-4444"}; struct person man = {"Mr.Lee", "820204 - xxxx512"}; man.info = &info;
printf("name : %s\n",man.name); printf("pID : %s\n",man.pID); printf("addr : %s\n",man.info->addr); printf("tel : %s\n",man.info->tel);
return 0; }
>함수의 인자로 전다로디는 구조체 변수 :값에 의한 전달(Call-By-Value), 레퍼런스에 의한 전달(Call-By-Reference) ex) #include<stdio.h>
struct simple { int data1; int data2; };
void show(struct simple ts); // Call-By-Value void show(struct simple* ps); // Call-By-Reference
int main(void) { struct simple s = {1,2}; show(s); // s의 멤버 출력 swap(&s); // s의 멤버 data1, data2의 값 변경 show(s); // s의 변경된 멤버 출력
return 0; }
void show(struct simple ts) // Call-by-value { printf("data1:%d, data2:%d\n",ts.data1, ts.data2); }
void swap(struct simple* ps) // Call-By-Reference { int temp; temp = ps -> data1; ps -> data1 = ps -> data2; ps -> data2 = temp; }
+구조체 변수의 리턴
ex) #include<stdio.h>
struct simple { int data1; int data2; };
void show(struct simple ts); struct simple getdata(void);
int main(void) { struct simple s = getdata(); show(s); return 0; }
void show(struct simple ts) { printf("data1:%d, data2:%d\n",ts.data1, ts.data2); }
struct simple getdata(void) { struct simple temp; scanf("%d %d ", &temp.data1, &temp.data2); return temp; } : 1. struct simple s = getdata() - 함수호출 2. return temp; - 변수 리턴 3. struct simple s = (temp 복사본); 대입 연산
>구조체를 포함하는 구조체 : 중첩된 구조체
#include<stdio.h>
struct point { int x; int y; };
struct circle { struct point p; // 4번째 줄에서 선언한 구조체의 변수 double radius; };
int main(void) { struct circle c1 = {10, 10, 1.5}; struct circle c2 = {{30, 30}, 2.4};
printf("[circle1] \n"); printf("x:%d, y:%d \n", c1.p.x, c1.p.y); printf("radius:%f \n",c1.radius); printf("[circle2] \n"); printf("x:%d, y:%d \n", c2.p.x, c2.p.y); printf("radius:%f \n",c2.radius);
return 0; }
>typedef
-형식 : typedef 자료형 새로운이름; : 기본 자료형에게 새로운 이름을 지어준다.
ex) #include<stdio.h>
typedef int INT; typedef int* P_INT;
typedef unsigned int UINT; typedef unsigned int* P_UINT;
typedef unsigned char UCHAR; typedef unsignde char* P_UCHAR;
int main(void) { INT a=10; // int a= 10; P_INT pA = &a; // int* pA=&a; UNIT b =100; // unsigned int b = 100; P_UNIT pB = &b; // unsigned int* pB = &b;
UCHAR c = 'a'; // unsigned char c = 'a'; P_UCHAR pC = &c; // unsigned char* pC = &c;
printf("%d, %d, %c \n", *pA, *pB, *pC); return 0; }
>구조체 정의와 분리된 typedef 선언 ex) #include<stdio.h>
struct Data { int data1; int data2; };
typedef struct Data Data;
/* typedef struct Data { int data1; int data2; }Data; */
int main(void) { Data d = {1, 2}; printf("%d, %d \n", d.data1, d.data2);
return 0; } <참조 : C 열혈강의> |
'삽질의 현장 > - C' 카테고리의 다른 글
SP_#000_A promise a promise! (0) | 2015.06.20 |
---|---|
[Surro] :: Pointer - 1. pointer의 이해 (0) | 2013.11.29 |
[Surro] :: C언어 이론 07. 포인터 (0) | 2013.10.06 |
[Surro] :: C언어 이론 06. 배열 (0) | 2013.10.06 |
[Surro] :: C언어 이론 05. 함수 (0) | 2013.10.06 |