Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Shellcode
- Linux
- hacking
- 백엔드
- deep learning
- hackthissite
- 딥러닝
- php
- Web
- 리눅스
- c++
- Scala
- Javascript
- BOF
- 파이썬
- mysql
- 챗GPT
- 경제
- hackerschool
- c
- flask
- 인공지능
- 러닝스칼라
- Python
- 러닝 스칼라
- webhacking
- ChatGPT
- backend
- BOF 원정대
- 웹해킹
Archives
- Today
- Total
jam 블로그
[C] 23. 구조체와 사용자 정의 자료형2 본문
728x90
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;
}
}
- 위와 같은 소스를 만들 수 있다.
'개발 및 관련 자료 > C' 카테고리의 다른 글
[C] 25. 메모리 관리와 동적 할당 (0) | 2013.05.12 |
---|---|
[C] 24. 파일입.출력 (0) | 2013.05.12 |
[C] 22. 구조체와 사용자 정의 자료형1 (0) | 2013.05.12 |
[C] 21. 문자와 문자열 처리 함수 (0) | 2013.05.12 |
[C] 19. 함수포인터와 void 포인터 (0) | 2013.05.12 |
Comments