2012-02-04 6 views
6

스탠포드의 Programming Abstractions 과정을 듣는 동안 다음과 같은 코드가 나타납니다.매개 변수와 함수 대 함수 매개 변수로 함수 포인터

void plot(double start, double end, double (fn)(double)) { 
    double i; 
    for (i = start; i <= end; i += 1) 
     printf("fn(%f) = %f\n", i, fn(i)); 
} 

double plus1(double x) { 
    return x + 1; 
} 

int main(void) { 
    plot(1, 10, plus1); 
    return 0; 
} 

GCC를 사용하여 시스템에서 코드를 컴파일 한 다음 G ++; 그들은 둘 다 완벽하게 달린다.

나는 기능 만 func2에게 i의 주소를 줄 것이다 void func2(int *a)&i을 통과하면서 함수와 같은 void func1(int a) 내로 int i = 2를 통과하면 해당 기능에 그 i의 새 복사본을 만들 것이라는 점을 알고있다.

fnplot으로 전달하는 메커니즘은 무엇인지 설명하고 매개 변수로 함수 포인터를 전달하는 것과 다른 점은 무엇입니까?

답변

7

void foo(double fn(double))void foo(double (*fn)(double)) 사이에는 전혀 차이가 없습니다. 두 함수 모두 함수에 대한 포인터를 매개 변수로 사용하는 함수를 선언합니다.

void bar(double arr[10])void bar(double* arr) 사이에 차이가없는 방식과 비슷합니다.

+0

당신은 배열에 관한 두 번째 주장에 대한 참조를 가지고 있습니까? 특히 C++ 일 때? – krlmlr

+0

이전에는'fn'은 함수에 대한 포인터이고, 후자의'fn' 함수는 명시 적으로 함수 –

+3

@ user946850에 대한 포인터로 선언되었습니다 :'... 8.3.5/5' : ...와 약간의 차이가 있습니다. 각 매개 변수의 유형을 결정할 때 "T 배열"또는 "T를 반환하는 함수"유형의 매개 변수는 각각 "T에 대한 포인터"또는 "T를 반환하는 함수에 대한 포인터"로 조정됩니다. ... – Mankarse

0

실수로 죄송합니다.

void foo(int (fn)(int)){} 
void bar(int (*fn)(int)){} 

과 같은 코드 위의 컴파일 :

의 gcc -S sample.c에

당신이 차이가 없다는 것을 발견 할 것이다. 다른 코딩 스타일.

당신은뿐만 아니라이 코드를 컴파일하고 실행하려고 할 수 있습니다

#include <stdio.h> 
void foo(int (fn)(int)) 
{ 
    printf("foo: %x.\n",fn); 
} 
void bar(int (*fn)(int)) 
{ 
    printf("bar: %x.\n",fn); 
} 
int main(int argc) 
{ 
    foo(main); 
    bar(main); 
    return 0; 
} 
+0

제 질문을 다시 읽어주십시오. 필자는 매개 변수 목록의 함수 포인터와 매개 변수 목록의 함수 원형 사이의 차이점을 물었습니다. – MrOrdinaire

+0

내 잘못. 나는 새로운 대답을 썼다. – for1096

관련 문제