2016-10-06 3 views
0

최근에 함수 포인터로 작업하게되어 기뻤습니다. 나는 그들이 어떻게 일하는지 알게되었다. 함수 포인터의 고전적인 예는 다음과 같습니다함수 포인터를 쓰는 것이 함수를 호출하는 것보다 낫다.

print(add(x,y)); 
print(sub(x,y)); 

을하고 나는 그것을 설명하기 위해 노력 :

int add() { 
    return (100+10); 
} 
int sub() { 
    return (100-10); 
} 

void print(int x, int y, int (*func)()) { 
    printf("value is : %d", (x+y+(*func)())); 
} 

int main() { 
    int x=100, y=200; 
    print(x,y,add); 
    print(x,y,sub); 
} 

누군가는 (주) 안에 호출하는 것보다 더 나은 방법이라는 일전에 나에게 물었다. 그것은 단지 스택에 관한 것입니까, 아니면 다른 뭔가가 아래에 있습니까?

+0

함수 포인터의 배열을 가져 와서 루프에서 호출하는 방법은 어떻습니까? 일반 인터페이스를 가지고, 제네릭 형식을 취하고 함수 포인터를 함수 포인터로 전달하는 방법은 어떻습니까? 고전적인 예는'qsort'이다. –

+0

'add (x, y)'와'sub (x, y)'는 C에서 컴파일 가능하지만 쓸모가 없기 때문에 C++에서는 컴파일되지 않습니다. ** 언어 *). 그래서 가장 즉각적인 대답은 "코드가 컴파일되지 않기 때문"일 것입니다. – WhozCraig

+0

당신의 예제는 함수 포인터를 사용하기에 충분할만큼 복잡하지는 않습니다. pointed-to 함수가 다른 함수를 실행하거나 특정 시간에 두 번 이상 호출되거나 호출 된 함수에 의해 선택된 인수로 호출되어야하는 예제를 고려하십시오. –

답변

6

내가 보여주는 코드가 왜 함수 포인터의 고전적인 예가 될지 이해가되지 않습니다. 함수 포인터 '유틸리티는 훨씬 더 분명 같은 코드에서이다 : 당신은 매개 변수로 함수에 대한 포인터에 동의하면

void transform(int *dst, const int *src, size_t len, int (*f)(int)) 
{ 
    for (size_t i = 0; i < len; ++i) 
    dst[i] = f(src[i]); 
} 

기본적으로, 그것은 수

당신이 의 데이터에 클라이언트가 제공하는 작업을 적용하는 방법 선택.

+0

아하하. 그것이 내가 찾고 있었던 것이다. 시원한! 매개 변수를 받아 들일 수 없기 때문에 'p [i] = f (p [i]) ()'이 아니어야합니다. –

+1

@HemantBhargava :'p [i]'** **는'some_int' 매개 변수입니다. – Jarod42

+0

@HemantBhargava'f (p [i])'가 이미'p [i]'에서 무엇인가 호출되고 있음을 주목하십시오. BTW, 나는 할당 표현의 양쪽에 나타나는'p '와의 혼란을 피하기 위해 예제를 수정했다. – Angew

2

일반 사용 사례 (일반화)는 qsort (https://linux.die.net/man/3/qsort)입니다. 정렬 알고리즘은 일반적인 목적이지만 구현은 항목을 비교하는 방법을 모릅니다. 왜냐하면 모든 유형이 될 수 있기 때문입니다. 따라서 두 요소를 비교하기 위해 호출 할 수있는 함수를 전달합니다.

0

"함수에 대한 포인터"는 개체입니다. 따라서 다른 객체와 마찬가지로 복사, 저장, 할당 할 수 있습니다. 함수 (일반 함수)에 대한 참조가 객체가 아닌 경우.

고전적인 예가 .... UI 소프트웨어에 대한 명백한 패턴이 된 콜백 함수를 사용하여 사용자 인터페이스 이벤트를 처리한다고 생각합니다.

1

함수 포인터는 예를 들어 하드 코드하여 호출 할 경우 거의 쓸모없는 오버 헤드입니다. 그들의 힘은 에서 동적으로을 선택하여 사용하거나 다른 함수로 전달할 수 있습니다.

함수 포인터를 배열에 넣고 루프 할 수 있습니다. 또는 사용자 입력 또는 입력 파일 내용 또는 기타 상황에 따라 선택한 하나의 을 호출 할 수 있습니다. 두 경우 모두 잠재적 긴 switch 또는 if 문 체인 대신 단일 동적 호출이있는 코드를 작성할 수 있습니다.

두 번째 - 더 유용한 개념은 다른 함수 (이를 '콜백'이라고도 함)에 전달하는 것입니다. 전형적인 예는 데이터 테이블과 비교 함수을 함수 포인터 형태로 사용하여 qsort을 호출하는 것입니다. 그런 다음 qsort는 표준 정렬 알고리즘 내에서 비교 함수를 사용합니다. 이것을 구현할 다른 방법은 없습니다.

관련 문제