如何正确传递指向函数的指针,C++直接在该指针上运行的另一个函数

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

本文关键字:函数 指针 另一个 运行 C++ 何正确      更新时间:2023-10-16

我正在学习使用 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() 尖叫:"无效的渲染器"。

当我这样做的时候

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

它有效。但我不喜欢这样。

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

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

通过以下方式解决问题

  • 传递对指针的引用

    void createWindow (SDL_Window*& gameWindow)
    {
        gameWindow = SDL_CreateWindow(/* arguments here */);
    }
    
  • 将指针传递给指针。注意:这是C和糟糕的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);
}

这样,您就可以将指针的地址提供给函数,并使其能够更改其值!

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

void createWindow (SDL_Window *& gameWindow)

希望这有帮助。不应更改代码的其余部分以使其正常工作。

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

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

创建窗口( 游戏窗口 );引擎盖下发生的事情只是将 NULL 作为参数传递。如果要修改游戏窗口指针,则必须传递其地址。

例如:

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

并称之为:createWindow( &gameWindow );

关于这个问题,您可以看到对此的深刻解释:按引用传递与按值传递有什么区别?