본문 바로가기
휴지통/C 언어

함수 포인터, void 포인터

by 신재권 2021. 1. 31.

함수도 주소 값을 가지고 있는데 , 이 주소값을 저장하는 변수를 함수 포인터라고 한다.

배열의 이름이 배열의 시작주소 값을 의미한다. 또한 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다.

함수의 이름은 상수의 형태인데, 이러한 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언을 할 수 있다.

 

int Func(int num) {... };

만약 위와 같이 함수가 선언되었다고 가정하면..

반환형 : int

매개변수  : int num

 

그리고 위의 함수의 이름 Func는 Func의 함수의 주소 값을 의미하는 상수형태의 함수 포인터가 된다.

Func의 형(type)은 반환형과 매개변수의 선언형태를 기준으로 구분한다.

 

int func1(int num1){..};

int func2(int num2){...};

double func3(double n1, double n2){...};

double func4(double n3, double n4){...};

 

위의 함수들이 선언되었다고 가정할 때

반환형과 매개변수의 선언형태가 일치하는 것끼리 짝 지으면 

func1와 func2,   func3 과 func4 이다. 

이 두 그룹은 반환형과 매개변수의 선언형태가 일치하므로 함수 포인터형도 일치하게된다.

 

함수 포인터를 위 함수 대상으로 선언해보면 

int (*fptr1) (int);

double (*fptr2) (double, double); 

으로 선언을 할 수 있다.

 

위 함수 포인터변수를 살펴보면

int : 반환형이 int인 함수 포인터

(*fptr1) : fptr1은 포인터

(int) : 매개변수 선언이 int하나인 함수 포인터 

 

위의 함수와 함수 포인터를 모두 선언 후 포인터 변수에 함수의 주소값을 대입연산을 사용해 저장하면 된다.

fptr1= func1

fptr2 = func3

 

위의 선언된 함수 포인터를 사용해 기존함수 func1과 func3을 호출할 수 있다.

fptr1(3);   // func1(3)과 동일한 결과

fptr2(2.5, 3.5);  //func3(2.5, 3.5)와 동일한 결과

 

또한 매개변수의 선언으로 함수 포인터가 올 수도 있다.

 


void *ptr   

위와 같이 선언된 포인터 변수를 'void형 포인터 변수'라 한다.

void 형 포인터 변수에는 어떠한 변수의 주소 값이든 담을 수 있다. 

하지만 단점도 가지고 있다.

위의 포인터 변수를 가지곤 값의 변경이나 참조가 불가능하다. 즉 어떠한 포인터 연산도 하지  못한다.

void형 포인터변수에는 어떠한 형(type)의 정보도 담겨있지 않으므로 이는 당연한 것이다.

 

int main(){
	int num=20;
	void *ptr =#
    *ptr = 20;  //컴파일에러
    ptr++;  //컴파일 에러
}

void형 포인터를 사용하는 기준은

일단 주소값에 의미만 두고, 포인터 형은 나중에 결정할때 사용된다. 

 


main함수를 통해 인자를 전달을 할수도 있다.

int main(int argc, char *argv[])

 

char *argv[]에 대해서 설명을 하자면

매개변수의 선언부분에 한해서 type *arr  == type arr[]가 같다고 설명했었다.

이를 char *argv[]에 대입해보면

char *argv[]  == char **argv 이다.

즉 매개변수 argv는 char형 더블 포인터 변수이고, 이는 char형 포인터 변수로 이뤄진 1차원 배열의 이름을 전달 받을 수 있는 매개변수이다. 

 

 

'휴지통 > C 언어' 카테고리의 다른 글

구조체  (0) 2021.02.04
문자열 입력 함수  (0) 2021.02.02
문자와 문자열  (0) 2021.02.01
다차원 배열과 포인터, 다중 포인터  (0) 2021.01.30
1차원 배열, 포인터  (0) 2021.01.23