[열혈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 = &num; // int 형 변수의 주소값을 저장한다.

  ptr = simple; // 함수의 주소값을 저장한다.(심지어 함수의 주소값까지도 저장 가능한 void형 포인터)
  return 0;
}

main 함수로의 인자전달 (argc, argv)

main 함수로 인자를 전달할 수 있다. 이때 main함수의 형태는
int main(void) 가 아니라
int main(int argc,char* argv[])이다.


#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