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

时间:2016-01-28 11:17:46

标签: c++ sdl-2

我正在学习使用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对它们起作用的方式,但我认为将一个传递给函数让我直接操作副本的变量,所以我不必返回任何东西。对我来说,看起来我正在操作变量地址的副本,而不是变量本身。

4 个答案:

答案 0 :(得分:4)

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 */);
    }
    

答案 1 :(得分:1)

当你传递指针时,它会被值传递! 因此,您只是在功能中更改本地副本的地址

解决方案:

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

int main()
{
      SDL_Window* gameWindow = NULL;
      createWindow(&gameWindow);
}
这样你就可以给你指向函数的地址,并让它改变它的值!

答案 2 :(得分:0)

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

void createWindow (SDL_Window *& gameWindow)

希望这会有所帮助。其余的代码不应该被改变以使其起作用。

答案 3 :(得分:-1)

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

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

createWindow(gameWindow);引擎盖下发生的事情就是将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?