함수도 주소 값을 가지고 있는데 , 이 주소값을 저장하는 변수를 함수 포인터라고 한다.
배열의 이름이 배열의 시작주소 값을 의미한다. 또한 함수의 이름도 함수가 저장된 메모리 공간의 주소 값을 의미한다.
함수의 이름은 상수의 형태인데, 이러한 함수의 주소 값 저장을 위한 포인터 변수를 별도로 선언을 할 수 있다.
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 |