함수 포인터 역참조: 수수께끼 풀기
C 프로그래밍에서 함수 포인터는 함수의 주소를 저장하는 변수입니다. 그러나 일반 변수와 달리 함수 포인터 역참조는 고유하게 동작합니다.
함수 포인터 역참조가 예상한 결과를 생성하지 않는 이유는 무엇입니까? 핵심은 함수 값이 rvalue 컨텍스트(위치가 아닌 값으로 사용되는 경우)에서 어떻게 작동하는지 이해하는 데 있습니다. C에서 rvalue 컨텍스트의 함수 값은 원래 함수 값에 대한 포인터로 자동으로 변환됩니다.
이 포인터를 *로 역참조하면 원래 함수 값이 검색됩니다. 그러나 이 값은 즉시 포인터로 다시 변환되어 포인터 변환의 무한 루프가 생성됩니다. 질문에 제공된 코드는 이 동작을 보여줍니다.
#include <stdio.h> void hello() { printf("hello"); } int main(void) { (*****hello)(); }
이 코드는 본질적으로 일련의 함수 포인터 역참조를 통해 hello 함수를 5번 호출합니다. 그러나 이러한 역참조는 실제로 함수를 실행하지 않습니다. 그들은 단지 함수 포인터를 검색한 다음 다시 포인터로 변환합니다. 최종 결과는 일련의 포인터 조작이지만 실제 함수 호출은 없습니다.
이런 일이 발생하는 이유를 이해하려면 비슷한 실험을 고려해 보세요.
int x; // Regular variable int *px = &x; // Pointer to the variable *px = 5; // Modifying the variable through the pointer
이 코드에서 포인터 역참조 * px를 사용하면 변수 x의 값을 수정할 수 있습니다. 그러나 함수 포인터의 경우 역참조는 함수 자체를 수정하는 것이 아니라 함수의 주소를 검색하는 것입니다.
C에서 함수는 변경할 수 없으므로 이러한 구별이 존재합니다. 즉, 함수를 수정할 수 없습니다. 포인터로만 호출하거나 전달할 수 있습니다. 따라서 동작을 수정하기 위해 함수 포인터를 역참조할 필요가 없습니다.
요약하면 함수 포인터 역참조는 함수를 실행하는 것이 아니라 해당 주소를 검색합니다. 그런 다음 이 주소는 즉시 포인터로 다시 변환되어 포인터 변환의 무한 루프가 발생합니다. 이 동작은 C의 rvalue 컨텍스트에 있는 함수 값의 고유한 기능이며 주소 참조를 위해 앰퍼샌드(&)를 명시적으로 사용하지 않고도 함수 포인터 작업을 편리하게 해줍니다.
위 내용은 C에서 함수 포인터를 역참조해도 함수가 실행되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!