传递函数是否通过引用传递?

时间:2013-10-20 02:40:10

标签: c function function-pointers

#include <windows.h>

DWORD WINAPI Main(LPVOID lpParam) {
    MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
    return S_OK;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    switch(fdwReason) {
        case DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hinstDLL);
        CreateThread(NULL, 0, &Main, NULL, 0, NULL);
        break;

        case DLL_PROCESS_DETACH:
        break;

        case DLL_THREAD_ATTACH:
        break;

        case DLL_THREAD_DETACH:
        break;
    }

    return TRUE;
}

为什么我可以用CreateThread(NULL, 0, &Main, NULL, 0, NULL);替换CreateThread(NULL, 0, Main, NULL, 0, NULL);,它仍然可以使用?是因为在C中,如果我传递一个方法,它会将它减少为指向该方法的指针吗?或者是因为DWORD是一个指针?

1 个答案:

答案 0 :(得分:2)

  1. 从技术上讲,在C中,所有内容都是按值传递的,而不是通过引用传递的。当指针作为参数传递时,它看起来像通过引用传递。
  2. 最有可能将DWORD定义为机器上具有两个单词大小的整数。
  3. 函数名称会自动转换为编译器指向函数的指针。
  4.   

    C99§6.3.2.1左值,数组和函数指示符

         

    函数指示符是具有函数类型的表达式。除非它是   sizeof运算符或一元&运算符的操作数,一个函数指示符   type''function returns type''转换为类型为''指针的表达式   函数返回类型''。

    此外,你可以使用*指向函数的指针,你得到函数指示符作为结果。使用它,你可以稍微玩一下:

    #include <stdio.h>
    
    typedef void (*func_ptr)(void);
    void foo(void)
    {
        printf("hello\n");
    }
    
    int main(void)
    {
        func_ptr p;
        p = &foo;   //function pointer
        p();
        p = foo;    //function name is converted to function pointer
        p();
        p = *foo;   //legal
        p();
        p = *****************foo;  //still legal
        p();
        return 0;
    }
    

    输出:

    hello
    hello
    hello
    hello