삽질의 현장/- C

[Surro] :: C언어 이론 08. 구조체

shovelman 2013. 10. 6. 22:22

8.구조체

 

- 구조체란? : 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것

: 관련 있는 데이터를 하나의 자료형으로 묶을 경우, 관리하기가 편리해지고, 프로그램의 코드도 한결 간결해진다.

 

>사용자 정의 자료형

:기본 자료형 변수를 묶어서 새로운 자료형을 만드는 것.

- 형식

struct point // point라는 이름의 구조체 선언

{

int x; // 구조체 멤버 int x;

int y; // 구조체 멤버 int y;

};

:point라는 이름의 구조체를 정의합니다. 이 구조체는 int형 변수 xy로 이뤄져있습니다.

 

 

+구조체 정의와 구조체 변수의 선언을 동시에 하기

-형식

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의 멤버 x10을 대입

p1.y = 20; // p1의 멤버 y20을 대입

...

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 열혈강의>