함수포인터 활용

이론/C/C++ 2016. 10. 27. 01:36 |

함수 포인터에 대한 정의 이다.

일반 포인터가 변수에 대한 주소를 가지고, 변수를 가리킬 수 있는것 처럼 함수, 즉 실행가능한 코드를 가리키고 있는 포인터이다.


위키에서의 예시를 먼저 확인 해본다면

func1 은 하나의 더블형 매개변수를 가지며, 다른 더블형을 반환한다.
(기능은 센티미터를 인치로 변환하게 된다)
func2 는 정수형, 상수 문자 배열에 대한 포인터를 매개변수로 가진다. 그리고 문자에 대한 포인터를 반환한다.
(기능은 문자배열에서 주어진 문자의 첫번째 발생에 대한 포인터를 반환하는 문자열 라이브러리 함수의 역할이다.)

함수 포인터로 선언 하는 방법은 :  함수의 리턴형  (*함수포인터명)(매개변수); 이런 식으로 된다
선언된 함수 포인터에 수포인터명 = 원하는 함수 방식으로 사용할 수 있게 되는 것이다.

이제 이 함수포인터 들을 조금 더 꼬아서 작성 해보자.


함수포인터가 익숙하지 않는 상태에선 이해하기 힘든 코드로 보인다. 그러니 하나씩 뜯어보자.

(실제로 이렇게 쓰는 경우도 있다고 어디서 듣긴했다...)


먼저 함수 선언부를 보자면

int func1(int a);

가장 기본적인, 처음에 배우는 정수형을 리턴하는 함수이다.


int func2(int (*p)(int),int a);

이전의 위키의 예시와 같이 생각하면 된다. 매개변수로 함수 포인터를 받는, 가장 기본적인 응용이라 생각된다.

함수의 내용에서 받은 함수를 호출하여 리턴값을 다시 리턴하는 방법을 활용하였다.


int (*func3(void))(int);

이번엔 리턴값이 함수포인터인 경우이다. 

위의 정의식을 그대로 첫번째 int 값에 넣어버리고 싶지만, 컴파일러가 그렇게 읽을 수는 없나보다.

따라서 해당 함수명의 앞에 리턴값이 포인터임을 알리는 *을 붙이고, 괄호로 해당 함수의 마지막까지 감싼다.(괄호를 하지 않으면 int*를 리턴값으로 인식할것이다)

마지막에 리턴하는 함수포인터의 매개변수 형식을 붙여주면 된다.

(위의 식에서 초록 글이 함수명이고, 노란글이 리턴형식이다.)


그냥 보기엔 어려워 보이지만, 몇번 보니까 조금은? 익숙해지는 거 같기도 하다..


다음은 메인에서의 호출 내용을 확인 해보자


int(*(*p)(void))(int) = func3;

p 라는 함수 포인터 변수를 선언하는 부분이다. 

원하는 함수는 리턴형이 리턴값을 int형으로 가지며 매개변수를 int형을 갖는 함수포인터 이고, 

자신의 매개변수는 void인 함수이다.


이후 호출 내용은 직접 확인 해볼 수 있도록 printf의 순서를 확인하자.



그래도 헷갈리는거 같다... ㅠㅠ


'이론 > C/C++' 카테고리의 다른 글

간단한 함수 포인터 예제  (0) 2015.06.16
C/C++ 시간 정보 얻기  (0) 2015.03.08
C++ 문자열 너비포함 출력  (0) 2015.03.08
C++에서 2차원 배열 동적할당, 반납  (0) 2015.01.10
Posted by *me
:

함수 포인터는 특정 함수에 대한 메모리 주소를 담을 수 있는 것이라고 한다.


함수 포인터를 쓰는 이유는

1. 프로그램 코드가 간결해진다.

2. 함수포인터를 배열을 이용하여 중복되는 코드를 줄일수 있다.

3. 상황에 따라 해당되는 함수를 호출 가능(ex: 계산기...)

그 외에도 콜백함수를 함수포인터로 구현할 수 있다.


int (*FuncPtr) (int,int); //함수포인터의 정의

반환형이 int형이고 인자로 int형 변수 2개를 가지는 함수를 담을 수 있는 함수 포인터이다.

(ex: int add(int x, int y) 같은 함수)


사용시에는 FuncPtr = add 혹은 FuncPtr = &add 라고 사용 하면됨.


typedef 활용가능,

typedef int (*funcPtr)(int ,int )


(ex: FuncPtr testFP = NULL;

testFP = add; )


//내가 해본 함수포인터 예제


// 다른 블로그에서 가져온 예제


출처: http://norus.tistory.com/8 - 노루의 씨분투 세상



'이론 > C/C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.10.27
C/C++ 시간 정보 얻기  (0) 2015.03.08
C++ 문자열 너비포함 출력  (0) 2015.03.08
C++에서 2차원 배열 동적할당, 반납  (0) 2015.01.10
Posted by *me
:
현재 날짜나 시간등이 필요한 경우가 많은데, 
time.h를 이용하면 현재 DATE정보를 받아올 수 있다.


간단한 소스를 검색해서 구현해보았지만, 대부분 그렇지만 시간에 관한 구조체나 함수에 대해 자세히는 이해가 되질 않는다. 그냥 일단 이렇게 쓰는걸로...ㅜㅜ ctime어쩌고.. 있던데.. 어려움..

'이론 > C/C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.10.27
간단한 함수 포인터 예제  (0) 2015.06.16
C++ 문자열 너비포함 출력  (0) 2015.03.08
C++에서 2차원 배열 동적할당, 반납  (0) 2015.01.10
Posted by *me
:

C++ 에서도 (C언어의 %5d였나?) 문자열 출력시 너비를 포함하여 출력할 수 있다.

즉,  "   a","abc"이거처럼 열을 맞춰서 출력한다고 해야할까..


ios에서 cout.width()를 이용하여 가능한데,

cout.width(폭의 크기), cout.file('문자') 로 사용한다.

예제를 작성해 보았다.




결과창:


'이론 > C/C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.10.27
간단한 함수 포인터 예제  (0) 2015.06.16
C/C++ 시간 정보 얻기  (0) 2015.03.08
C++에서 2차원 배열 동적할당, 반납  (0) 2015.01.10
Posted by *me
:

미로찾기 알고리즘을 풀다가 만든 것입니다.


'이론 > C/C++' 카테고리의 다른 글

함수포인터 활용  (0) 2016.10.27
간단한 함수 포인터 예제  (0) 2015.06.16
C/C++ 시간 정보 얻기  (0) 2015.03.08
C++ 문자열 너비포함 출력  (0) 2015.03.08
Posted by *me
: