23. 구조체와 사용자 정의 자료형2
I. 구조체 변수의 전달과 리턴
- 함수의 인자로 전달되는 구조체 변수
- #include <stdio.h>
- struct simple
{
int data1;
int data2;
}; - void show(struct simple ts);
void swap(struct simple* ps); - int main()
{
struct simple s={1,2}; - show(s);
swap(&s);
show(s);
return 0;
} - void show(struct simple ts)
{
printf("data1 : %d,data2 : %d\n",ts.data1,ts.data2); - }
void swap(struct simple* ps)
{
int temp;
temp = ps->data1;
ps->data1=ps->data2;
ps->data2 = temp;
}
-
show 함수에서는 변수 s가 지니고 있는 값을 매개 변수 ts에 복사하게 된다.
- 따라서 매개변수 이자 show 함수의 지역 변수인 ts는 main 함수 내에 존재하는 변수 s와 같은 값을 지니게 된다.
- swap 함수는 구조체 변수의 포인터를 인자로 전달 받는다. 그리고 전달받은 구조체 변수의 변수의 멤버 값을 서로 바꿔주고 있다.
- 구조체 변수의 연산
- #include <stdio.h>
- struct simple
{
int data1;
int data2;
}; - void show(struct simple ts);
- int main()
{
struct simple s1={1,2};
struct simple s2; - s2=s1;
show(s2);
return 0;
} - void show(struct simple ts)
{
printf("data1 : %d,data2:%d\n",ts.data1,ts.data2);
}
-
가장 대표적으로 허용되는 연산은 대입 연산이다.
- 대입연산 이외에 sizeof 연산이나 포인터와 관련된 연산은 가능하다.
- 구조체 변수의 리턴
- #include <stdio.h>
- struct simple
{
int data1;
int data2;
}; - void show(struct simple ts);
struct simple getdata(void); - int main()
{
struct simple s =getdata();
show(s); - return 0;
} - void show(struct simple ts)
{
printf("data1 : %d,data2 : %d",ts.data1,ts.data2);
} - struct simple getdata(void)
{
struct simple temp;
scanf("%d %d",&temp.data1,&temp.data2);
return temp;
}
-
getdata에서 temp를 선언해서 입력을 받은 후에 temp를 리턴하는 방법이다.
- 구조체 변수가 함수의 인자로 전달과 대입이 가능하고, 함수 내에서 리턴도 가능하다.
II. 구조체의 유용함에 대한 두가지 이야기
- 책을 참고하세요.
III. 구조체를 포함하는 구조체
- 구조체가 구조체를 포함한다는 의미는?
- #include <stdio.h>
- struct point
{
int x;
int y;
}; - struct circle
{
struct point p;
double radius;
}; - int main()
{
struct circle c1 = {10,10,1.5};
struct circle c2 = {{30,30},2.4}; - printf("[circle]\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;
}
- 구조체 안에 구조체가 있다고 생각하면 된다.
-
중첩된 구조체 변수의 초기화
-
case 1 : struct circle c1 = {10,10,1.5};
- 위와 같은 경우 struct circle c1 = {10,11}; 이럴 경우 x와 y에 10과 11이 들어가고 radius는 0.0 이 들어간다.
-
case 2 : struct circle c2 = {{30,30},2.4};
- 위와 같은 경우 struct circle c2 = {{1},2}; 이럴 경우 x에는 1이 y에는 0 radius는 2가 들어간다.
-
IV. 새로운 자료형의 완성
-
typedef란 키워드는 무엇인가?
-
이미 존재하는 자료형에 새로운 이름을 붙이기 위한 용도로 사용된다.
- typedef int INT : int형에 INT라는 이름을 붙여 준다는 뜻이다.
-
- #include <stdio.h>
- typedef int INT;
typedef int* P_INT; - typedef unsigned int UINT;
typedef unsigned int* P_UINT; - typedef unsigned char UCHAR;
typedef unsigned char* P_UCHAR; - int main()
{
INT a = 10;
P_INT pA = &a; - UINT b = 100;
P_UINT pB = &b;
UCHAR c = 'a';
P_UCHAR pC = &c; - printf("%d, %d, %c\n",*pA,*pB,*pC);
return 0;
} - 이런식으로 사용한다.
-
typdef와 구조체 변수의 선언
- 구조체 정의와 분리된 typedef 선언
- #include <stdio.h>
- struct Data
{
int data1;
int data2;
};
typedef struct Data Data;
int main()
{
Data d={1,2};
printf("%d %d",d.data1,d.data2);
return 0;
}
- 위와 같은 식으로 struct Data를 Data로 이름을 선언해서 메인에서 struct Data d라고 안하고 Data d 라고 하였다.
- 구조체 정의와 typedef 선언 동시에 하기
- struct Data
{
int data1;
int data2;
};
typedef struct Data Data; - typedef struct Data
{
int data1;
int data2;
}Data;
- 두개의 struct를 보면 같은 것이다.
- 구조체의 이름도 생략이 가능하다
- typedef struct Data
{
int data1;
int data2;
}Data; - typedef struct
{
int data1;
int data2;
}Data;
- 위의 두개의 구조체는 완전히 같은 선언은 아니다.
- #include <stdio.h>
- typedef struct Dog
{
int data1;
int data2;
}Dog;
typedef struct
{
int data1;
int data2;
}Cat;- int main()
{
Dog d1;
struct Dog d2; - Cat c1;
struct Cat c2;
return 0;
};
- Dog 구조체는 typedef에 의한 선언이나 이전 형식도 가능하나 Cat은 구조체의 이름이 없기 때문에 typedef에 의한 선언은 가능하나 이전 형식은 안된다
V. 공용체
-
공용체
- 서로 다른 자료형의 변수를 하나의 메모리 공간에서 공유하는 경우에 사용한다.
- 위와 같이 메모리를 공유하는 식이다.
- 멤버 중 가장 메모리를 많이 요구 하는 멤버에 초점을 둬서 메모리를 할당한다.
- #include <stdio.h>
union u_data
{
int d1;
double d2;
char d3;
}; - int main()
{
union u_data data; - data.d2 = 3.3;
- printf("%d, %f, %c\n",data.d1,data.d2,data.d3);
- data.d1 = 2;
printf("%d, %f, %c\n",data.d1,data.d2,data.d3); - data.d3 = 'a';
printf("%d, %f, %c\n",data.d1,data.d2,data.d3);
return 0;
}
- 단지 이렇게 작동한다는 것만 알아두면 된다.
VI. 열거형
-
열거형의 정의와 그 의미
-
enum color{RED = 1, GREEN = 3,BLUE=5};
-
위와 같은 식으로 만들며 color라는 이름의 자료형을 정의하고 그 안에 이름의 상수를 정한다.
- 이름에 상수를 안정해 주면 처음은 항상 0이다.
-
-
- 열거형을 사용하는 이유
- #include <stdio.h>
- enum days{MON,TUE,WED,THU,FRI,SAT,SUN};
- int main()
{
int day;
printf("Input a day(0:monday~6:sunday) : ");
scanf("%d",&day); - switch(day)
{
case MON:
printf("월\n");
break;
case TUE:
printf("화\n");
break;
case WED:
printf("수\n");
break;
case THU:
printf("목\n");
break;
case FRI:
printf("금\n");
break;
case SAT:
printf("토\n");
break;
case SUN:
printf("일\n");
break;
}
}
- 위와 같은 소스를 만들 수 있다.
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
25. 메모리 관리와 동적 할당 (0) | 2008.12.07 |
---|---|
24. 파일 입.출력 (0) | 2008.12.07 |
22. 구조체와 사용자 정의 자료형1 (0) | 2008.12.07 |
21. 문자와 문자열 처리 함수 (0) | 2008.12.07 |
19. 함수포인터와 void 포인터 (0) | 2008.12.07 |