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
- hacking
- 인공지능
- webhacking
- Web
- c
- 웹해킹
- ChatGPT
- 러닝 스칼라
- backend
- 챗GPT
- mysql
- 리눅스
- BOF 원정대
- flask
- php
- 딥러닝
- 백엔드
- Scala
- Linux
- Python
- deep learning
- c++
- 경제
- Shellcode
- hackerschool
- Javascript
- hackthissite
- 러닝스칼라
- 파이썬
- BOF
Archives
- Today
- Total
jam 블로그
[C] 19. 함수포인터와 void 포인터 본문
728x90
I. 함수 포인터
함수 포인터란 무엇인가?
- 함수의 이름은 메모리상에 존재하는 함수의 위치를 기리키는 포인터.
함수 포인터의 포인터 타입은 어떻게 되는가?
- 함수 이름의 포인터 타입을 결정짓는 요수는 리턴형과 전달인자이다.
- double fct2(doubel a, double b)
- {
- double add = a+b;
- return add;
- }
- 위와 같은 함수가 있다면 리턴형은 double 이고 double 형 인자를 두 개 전달받는 포인터 타입이다. 라고 말 할 수 있다.
- 적절한 함수 포인터의 선언
- int(*fPtr1)(int);
- 위와 같은 형태로 리턴형(*함수명)(인자값) 이런식으로 쓰면 된다.
- #include <stdio.h>
- void Add(int a, int b);
void SPrint(char *str1); - int main()
{
char *string = "Function Pointer";
int a= 10,b=20; - void (*fPtr1)(int,int ) = Add;
void (*fPtr2)(char*) = SPrint; - fPtr1(a,b);
fPtr2(string); - return 0;
} - void Add(int a, int b)
{
printf("a + b : %d\n",a+b);
} - void SPrint(char *str1)
{
printf("문자열 ; %s\n",str1);
}
위의 소스에서 보면 void (*fPtr1)(int,int) = Add라고 써있는데 리턴값이 void이고, int형 인자를 2개 받는 fPtr1함수를 Add라고 정의 한다는 것이다
- Add는 함수명이니 fPtr1 은 Add 함수와 같다고 보면 되는 것이다.
- #include <stdio.h>
- void SelFunction(int s);
void Add(void);
void Min(void); - int main()
{
int sel; - while(1)
{
printf("선택 : 덧셈(1),뺄셈(2),종료(3)");
scanf("%d",&sel);
if (sel == 3)
break;
SelFunction(sel);
}
printf("프로그램 종료되었습니다. \n");
return 0;
}- void SelFunction(int s)
{
void(*fPtr)(void);
if (s==1)
fPtr = Add;
else
fPtr = Min;
fPtr();
} - void Add(void)
{
int a,b;
printf("덧셈할 두 수 넣어라:");
scanf("%d %d",&a,&b);
printf("덧셈 결과 : %d\n",a+b);
}
void Min(void)
{
int a,b;
printf("뺄셈할 두수를 넣어라:");
scanf("%d %d",&a,&b);
printf("뺄셈 결과 : %d\n",a-b);
}
- 위의 소스를 보면서 함수포인터를 생각핼 보면 쉬울 것이다.
II. void형 포인터
void형 포인터는 어떤 형태든 담을수 있는 포인터 이다.
- 단점은 void 포인터를 가지고는 아무런 일을 하지 못하기 때문이다.
- void형 포인터는 일단 주소 값을 저장해 두고, 포인터의타입은나중에 결정 하는 식이어서 메모리 동적 할당때 유용하게 쓰인다.
- int n =10;
- void *vp = &n;
- *((int*)vp) = 20;
- 두번째 줄은 void형 포인터 선언 및 초기화를 한 것이고, 세번째 줄은 20으로 변경하기 위해서 int형으로 형변환하고 있는 것이다.
III. main 함수도 인자를 받을 줄 알아요.
- main 함수를 통한 인자의 전달
- #include <stdio.h>
- int main(int argc, char *argv[])
{
int i=0;
printf("전달된 문자열의 수 : %d\n",argc);
for (i=0;i<argc;i++)
{
printf("%d번째 문자열 : %s\n",i+1,argv[i]);
}
return 0;
}
인자의 형성 과정
위의 소스에 대한 설명이다.
- 예를 들어 C:\main\main.exe 123 kkk 이렇게 실행을 시켰다고 보자.
- 그럼 위에 실행 시킨 것이 어떻게 되는지 그림으로 보자.
- 위 처럼 저장이 된다. 따라서 argc는 3이고, argv 배열에 들어가 있는 것은 위와 같다.
- 참고로 *argv[] 이렇게 썼었는데 **argv와 동일하다.
'개발 및 관련 자료 > C' 카테고리의 다른 글
[C] 22. 구조체와 사용자 정의 자료형1 (0) | 2013.05.12 |
---|---|
[C] 21. 문자와 문자열 처리 함수 (0) | 2013.05.12 |
[C] 18. 다차원 배열 그리고 포인터 (0) | 2013.05.12 |
[C] 17. 포인터의 포인터 (0) | 2013.05.12 |
[C] 16. 다차원 배열 (0) | 2013.05.12 |
Comments