답변
것은
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 표준에서
(6.3.2.1 Lvalues, 배열, 기능 지정자를) 쓸 수 지정자는 함수 유형을 갖는 표현식입니다. sizeof 연산자 65의 피연산자가 아니면) 단항 & 연산자 인 경우 함수 반환 유형이 인 함수 지정자가 유형 포인터 '함수 포인터 반환 유형'을 갖는 표현식으로 변환됩니다 .void (*pfs)(void) = *****fs; long int (*pfact)(int) = *****fact;
OpenGL ES 헤더 파일을 찾았습니다. (Khronos의 공식 사이트에서) 실제로 이것을합니다. –
이것은 함수 포인터에 typedef를 사용하는 특별한 방법입니다. 더 평소와 같이 :'typedef void (* voidFnVoid_t) (void);'그리고'voidFnVoid_t pfs = fs'. 여기에있는'FUNC1'의 typedef에서는'FUNC1' 타입의 객체 만 선언 할 수 없으므로'FUNC1 *'만 선언 할 수 있습니다. 따라서 "function-pointer type"이 아닌 "function type"을 갖는 것은 아무런 의미가 없습니다. – Clifford
@Clifford 게시물은 귀하의 의견 표명에있어 평범하지 않거나 이상하지 않습니다. 이 게시물은 선언을 이해하는 방법에 관한 것입니다. –
이 구문은 함수 포인터를 정의합니다.당신은 다음과 같이 사용할 수 있습니다 :
void a() {
//do something
}
int main() {
void (*functionPointer)();
functionPointer = a;
//or
functionPointer = &a;
//call the funcion pointer as you would a regular function
functionPointer();
}
주요 이유를 함수 포인터 배열이 정말로 테이블을 이동하지 않기 때문에이 따옴표에 ("점프 테이블을"콜백 기능을하는 함수 포인터를하는 사용하는 실제 점프 테이블을. 어셈블리 언어로만 만들 수 있음).
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임을 지적했습니다.
이들은 함수 포인터입니다. 귀하의 예 :
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);
}
이이 함수 포인터 –
참조 [C 작업에 함수 포인터를 어떻게해야합니까?] (https://stackoverflow.com/q/840501/10077) –
[무엇을 "무효 (* F) (무효) "C 언어에서] (https://stackoverflow.com/questions/47167816/what-does-void-fvoid-in-c-mean) go 대신 검색해야 함 –