2

사람은 C 코드의 두 라인을 설명 할 수 있습니다.void (*) void와 int (*) int는 C에서 무엇을 의미합니까?</p> <pre><code>void (*pfs)(void) = &fs; long int (*pfact)(int) = &fact; </code></pre> <p>내가 설명은 구글에서 검색을 시도했지만 나는 그것에 대해 아무것도 찾을 수 없습니다 :

+8

이이 함수 포인터 –

+1

참조 [C 작업에 함수 포인터를 어떻게해야합니까?] (https://stackoverflow.com/q/840501/10077) –

+0

[무엇을 "무효 (* F) (무효) "C 언어에서] (https://stackoverflow.com/questions/47167816/what-does-void-fvoid-in-c-mean) go 대신 검색해야 함 –

답변

3

것은

void (*pfs)(void)=&fs; 
long int (*pfact)(int)=&fact; 

당신이

typedef void FUNC1(void); 
typedef long int FUNC2(int); 

예를 들어 같은 함수 선언에 대한 형식 정의 이름을 소개하고

FUNC1 *pfs = &fs; 
FUNC2 *pfact = &fact; 

그래서 원래 선언이 선언 쓸 수 이러한 선언을 더 명확하게하려면 지정된 유형의 함수에 대한 포인터 및 주소로 초기화 주어진 함수의. 여기

#include <stdio.h> 

typedef void FUNC1(void); 
typedef long int FUNC2(int); 

void fs(void) 
{ 
    puts("Hello Islacine"); 
} 

long int fact(int x) 
{ 
    return x; 
} 

int main(void) 
{ 
    FUNC1 *pfs = &fs; 
    FUNC2 *pfact = &fact; 

    pfs(); 

    printf("sizeof(long int) = %zu\n", sizeof(pfact(0))); 

    return 0; 
} 

출력이

Hello Islacine 
sizeof(long int) = 8 

처럼 보일 수있는 시범 프로그램을 고려입니다 대신

FUNC1 *pfs = &fs; 
    FUNC2 *pfact = &fact; 

또는 대신

void (*pfs)(void)=&fs;   
    long int (*pfact)(int)=&fact; 
0,123,516의

당신도 쓸 수 있기 때문에 함수 지정자가 작동하려면 포인터로 변환됩니다 드문 예외를 제외하고 표현의

FUNC1 *pfs = fs; 
    FUNC2 *pfact = fact; 

또는

void (*pfs)(void) = fs;   
    long int (*pfact)(int) = fact; 

.

심지어

4 함수를 :)

FUNC1 *pfs = *****fs; 
    FUNC2 *pfact = *****fact; 

또는 C 표준에서

void (*pfs)(void) = *****fs;   
    long int (*pfact)(int) = *****fact; 

(6.3.2.1 Lvalues, 배열, 기능 지정자를) 쓸 수 지정자는 함수 유형을 갖는 표현식입니다. sizeof 연산자 65의 피연산자가 아니면) 단항 & 연산자 인 경우 함수 반환 유형이 인 함수 지정자가 유형 포인터 '함수 포인터 반환 유형'을 갖는 표현식으로 변환됩니다 .

+0

OpenGL ES 헤더 파일을 찾았습니다. (Khronos의 공식 사이트에서) 실제로 이것을합니다. –

+1

이것은 함수 포인터에 typedef를 사용하는 특별한 방법입니다. 더 평소와 같이 :'typedef void (* voidFnVoid_t) (void);'그리고'voidFnVoid_t pfs = fs'. 여기에있는'FUNC1'의 typedef에서는'FUNC1' 타입의 객체 만 선언 할 수 없으므로'FUNC1 *'만 선언 할 수 있습니다. 따라서 "function-pointer type"이 아닌 "function type"을 갖는 것은 아무런 의미가 없습니다. – Clifford

+0

@Clifford 게시물은 귀하의 의견 표명에있어 평범하지 않거나 이상하지 않습니다. 이 게시물은 선언을 이해하는 방법에 관한 것입니다. –

3

이 구문은 함수 포인터를 정의합니다.당신은 다음과 같이 사용할 수 있습니다 :

void a() { 
    //do something 
} 

int main() { 
    void (*functionPointer)(); 
    functionPointer = a; 
    //or 
    functionPointer = &a; 

    //call the funcion pointer as you would a regular function 
    functionPointer(); 
} 

주요 이유를 함수 포인터 배열이 정말로 테이블을 이동하지 않기 때문에이 따옴표에 ("점프 테이블을"콜백 기능을하는 함수 포인터를하는 사용하는 실제 점프 테이블을. 어셈블리 언어로만 만들 수 있음).

1

void (*) (void) 및 int (*) (int)는 C에서 무엇을 의미합니까?

그들은 단순히 void 인수를 취하고 void를 반환하는 함수 포인터입니다.

void (*pfs)(void)=&fs; 

pfs는 void로 인수를 취하고 void를 반환하는 함수에 대한 포인터입니다. 이것은 동일한 서명 유형, 즉 fs의 함수로 초기화되었습니다.

long int (*pfact)(int)=&fact; 

pfact는 int를 인수로 사용하고 long int를 reutring하는 함수에 대한 포인터입니다. 할당 후 pfact가 function 사실을 가리키고 있습니다.

추가 참고 :

복잡한 선언을 읽을 수있는 도구가 있습니다. 그 중 하나가 https://cdecl.org/입니다. 또한 다른 사람들이 함수에 대한 포인터를 사용하여 작업하는 더 좋은 방법이 typdef임을 지적했습니다.

2

이들은 함수 포인터입니다. 귀하의 예 :

void (*pfs)(void)=&fs; 

"pfs"라는 변수를 생성하고 있습니다. 이 변수에는 인수를 취하지 않고 아무것도 반환하지 않는 함수 유형이 있습니다.

다음은 예제를 훨씬 명확하게 보여줍니다.

return_type (*variable_name) (argument_list) 

앞의 부분을 이해하면 = 기호의 오른쪽이 꽤 쉽습니다.

우리가하는 일은 우리 함수 포인터 (변수) "pfs"에 함수 "fs"의 위치를 ​​지정하는 것입니다.

위의 설명을 데모하기위한 전체 예제입니다.

#include <stdio.h> 
void my_print_method(int number) { 
    printf("The number is: %d", number); 
} 
int main() { 
    // Declare our function pointer variable 
    void (*printer)(int); 

    // Assign our function pointer 'printer' to the method 'my_print_method' 
    printer = &my_print_method 

    // We can also assign the method to our function pointer as such: 
    printer = my_print_method 

    // Use our function pointer as if it were a function 
    (*printer)(55); 

    // Keep in mind that that in C we can simply write the function call as such: 
    printer(55); 

}