19. 함수포인터와 void 포인터
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와 동일하다.
-
이 글은 스프링노트에서 작성되었습니다.
'2. C/C++ > 01. C' 카테고리의 다른 글
22. 구조체와 사용자 정의 자료형1 (0) | 2008.12.07 |
---|---|
21. 문자와 문자열 처리 함수 (0) | 2008.12.07 |
18. 다차원 배열 그리고 포인터 (0) | 2008.12.07 |
17. 포인터의 포인터 (0) | 2008.12.07 |
16. 다차원 배열 (0) | 2008.12.07 |