【问题标题】:Does passing a function pass by reference?传递函数是否通过引用传递?
【发布时间】:2013-10-20 02:40:09
【问题描述】:
#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, &amp;Main, NULL, 0, NULL);,它仍然可以工作?是因为在 C 中,如果我传递一个方法,它会将其简化为指向该方法的指针吗?还是因为DWORD是指针?

【问题讨论】:

    标签: c function function-pointers


    【解决方案1】:
    1. 从技术上讲,在 C 中,所有内容都是按值传递的,而不是通过引用传递的。当指针作为参数传递时,它看起来就像通过引用传递。
    2. 很可能DWORD 被定义为机器上两个字大小的整数。
    3. 编译器会自动将函数名转换为指向函数的指针。

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

    函数指示符是具有函数类型的表达式。除了当它是 sizeofoperator 或一元 &amp;operator 的操作数,一个函数指示符 类型“函数返回类型”被转换为具有类型“指针”的表达式 函数返回类型''。

    此外,您可以使用* 指向函数的指针,从而获得函数指示符作为结果。使用这个,你可以玩一下:

    #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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-02
      • 2022-01-11
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多