【发布时间】:2016-05-21 13:57:44
【问题描述】:
我正在使用 SDL2 进行编程,但我无法理解以下原因。这有效:
SDL_Window *window;
SDL_Surface *screen_surface;
SDL_Surface *picture;
auto initWindow(void)
{…}
auto loadMedia(void)
{…}
auto close(void)
{…}
int main(void)
{
initWindow();
loadMedia();
…
close();
}
但事实并非如此:
auto initWindow(SDL_Window *window, SDL_Surface *screen_surface)
{…}
auto loadMedia(SDL_Surface *picture, std::string resource)
{…}
auto close(SDL_Window *window, SDL_Surface *picture)
{…}
int main(void)
{
SDL_Window *window;
SDL_Surface *screen_surface;
SDL_Surface *picture;
initWindow(window, screen_surface);
loadMedia(picture, "resource_file.bmp");
…
close(window, picture);
}
唯一的区别是我把window、screen_surface和picture从文件范围中取出,放到块范围中(即主函数),而不是在这些函数中引用全局变量,我使用参数。
但是,当我尝试运行它时,它会显示一个白屏,但不会显示任何错误。我不明白这里出了什么问题。
【问题讨论】:
-
使用您的 IDE 调试器单步执行这两个版本以查看区别的理想人选。
-
void f(int x) {x = 5;}int main() {int i = 7; f(i); printf("%d\n", i);}打印什么,为什么? -
要详细说明
initWindow(SDL_Window *window, SDL_Surface *screen_surface),您正在传递此声明中指针的副本。 -
@henrikgiesel 没有? C 没有引用调用这样的东西。
-
@henrikgiesel:是的,在您调用
initWindow函数之前,它们会指向内存中的同一个位置。但是,在initWindow中,您更改 已复制 指针指向的内容。问题是这不会影响main中声明的指针,您只是修改initWindow中的复制 指针。