如何正确地将指针传递给 C++ 中的函数,以便直接在该指针上运行的另一个函数?

How to properly pass a pointer to a function in C++ for another function operating directly on that pointer?

我正在学习使用 SDL2 库创建 C++ 应用程序,但在尝试组织代码时遇到了问题。

这是一个说明情况的简单示例:

void createWindow (SDL_Window *gameWindow)
{
    gameWindow = SDL_CreateWindow(/* arguments here */);
}

int main (int argc, char* argv[])
{
    SDL_Window* gameWindow = NULL;
    createWindow(gameWindow);
    // some code here...
}

为什么不起作用?当我尝试编译代码时,SDL_GetError() 尖叫:"Invalid Renderer".

当我这样做的时候

SDL_Window* createWindow (SDL_Window* gameWindow)
{ 
    gameWindow = SDL_CreateWindow (/* arguments here*/);
    return gameWindow;
}

有效。但是我不喜欢那样。

我可能不了解指针或 SDL2 对它们的工作方式,但我认为将一个指针传递给函数可以让我直接对变量而不是副本进行操作,所以我不必 return 任何事物。对我来说,看起来我是在操作变量地址的副本,而不是变量本身。

您正在传递一个指针,但您正在尝试分配指针本身。 尝试通过引用传递,如下所示:

void createWindow (SDL_Window *& gameWindow)

希望这对您有所帮助。不应更改其余代码才能使其正常工作。

C 中的参数按值 传递,也就是说,参数被复制并且应用于函数中参数的每个修改都会改变该副本的值,不是实际传递的参数.

通过

解决问题
  • 传递对指针的引用:

    void createWindow (SDL_Window*& gameWindow)
    {
        gameWindow = SDL_CreateWindow(/* arguments here */);
    }
    
  • 将指针传递给指针。注意:这是 C-ish 和糟糕的 C++ 代码!

    void createWindow (SDL_Window** gameWindow)
    {
        *gameWindow = SDL_CreateWindow(/* arguments here */);
    }
    
  • 返回指针:

    SDL_Window* createWindow()
    {
        return SDL_CreateWindow(/* arguments here */);
    }
    

当您传递指针时,它会按值传递! 所以你只是在你的函数中改变本地副本的地址

解决方案:

void createWindow(SDL_Window **gameWindow)
{
     *game_Window = SDL_CreateWindow(/*...*/);
}

int main()
{
      SDL_Window* gameWindow = NULL;
      createWindow(&gameWindow);
}

通过这种方式,您可以将指针的地址提供给函数并使其能够更改它的值!

这不是关于 SDL 如何工作,而是关于 c++ 如何处理参数。

当您将任何变量作为参数传递给函数时,默认行为是获取变量的值并将其复制到函数内部的变量中。所以..在你这样做的情况下。

createWindow(游戏窗口);幕后发生的事情只是将 NULL 作为参数传递。如果你想修改 gameWindow 指针,你必须传递它的地址。

例如:

void createWindow( SDL_Window ** pointer ) { 
    *pointer = SDL_CreateWindow( /** args **/ );
}

并称它为:createWindow( &gameWindow );

你可以看到关于那个问题的深入解释:What's the difference between passing by reference vs. passing by value?