[열혈C프로그래밍] chapter 17. 함수 포인터 & void 포인터
chapter 17
함수 포인터 & void 포인터
함수 포인터 & void 포인터
-
변수만 메모리에 저장되는 것이 아니다. 함수도 메모리에 바이너리 형태로 저장되어있다 호출시 실행되는 것이다.
-
따라서 함수도 주소값이 있고, 함수의 주소값도 포인터로 저장할 수 있다. 이 포인터를 ‘함수 포인터’라 한다.
-
배열의 이름이 배열의 시작 주소값을 의미하듯, 함수의 이름도 함수가 저장된 메모리의 주소값을 나타낸다.
함수 포인터의 포인터 type (반환형과 매개변수 모두 고려)
int SimpleFunc(int num){...} // 함수의 이름 SimpleFunc의 type은
// 반환형이 int이고 매개변수로 int형 변수가 하나 선언된 포인터 형.
double Complexfunc(double num1, double num2) {...} // 함수의 이름 Complexfuc의 type은
// 반환형이 double이고 매개변수로 두개의 double형 변수가 선언된 포인터 형.
함수 포인터 변수 선언.
int SoSimple(int num1,int num2){....} 이면
함수 포인터의 선언은
int (*fptr) (int, int);로 해야한다.
void ShowString(char *str)인 경우,
함수 포인터의 선언은
void (*fptr2) (char*); 로 해야 한다.
함수 포인터 변수를 매개변수로 사용하는 예
## include <stdio.h>
int whoisFirst(int age1, int age2, int (*fptr) (int, int)){
return fptr(age1,age2);
}
int olderFirst(int age1, int age2){
if(age1>=age2)
return age1;
else // age2>age1
return age2;
}
int youngerFirst(int age1, int age2){
if(age1>=age2)
return age2;
else //age2>age1
return age1;
}
int main(void){
int num1 =20;
int num2 =10;
printf("older: %d \n", whoisFirst(num1,num2,olderFirst));
printf("younger: %d \n", whoisFirst(num1,num2,youngerFirst));
return 0;
}
=>기발하다, 기발해.
형(type)이 존재하지 않는 void 포인터
void *ptr;
=>ptr을 void 포인터라 한다.
#include <stdio.h>
void simple(void){
printf("hello\n");
}
int main(void){
void *ptr; //어떤 타입의 주소값이든 저장할수 있는 void 포인터 ptr.
int num=20;
ptr = # // int 형 변수의 주소값을 저장한다.
ptr = simple; // 함수의 주소값을 저장한다.(심지어 함수의 주소값까지도 저장 가능한 void형 포인터)
return 0;
}
main 함수로의 인자전달 (argc, argv)
main 함수로 인자를 전달할 수 있다. 이때 main함수의 형태는
int main(void) 가 아니라
int main(int argc,char* argv[])이다.
- argc는 arguments count로 인자의 개수를 나타낸다.
- argv는 arguments vector로 전달되는 문자열(인자)들의 배열을 나타낸다.
#include <stdio.h>
int main(int argc, char* argv[]){
printf("전달되는 인자의 개수: %d \n", argc);
for(int i=0; i<argc; i++)
printf(" %s\n", argv[i]);
return 0;
}
gcc argc_gv.c
./a.out i love you
실행결과:
전달되는 인자의 개수: 4
./a.out
i
love
you