4

这个问题是建立在我之前的问题之上的。

我有这个结构。它使用 SDL2:

void init_window(SDL_Window *window)
{
    window = SDL_CreateWindow(…);
}

int main(void)
{ 
    SDL_Window  *window;
    init_window(window);
}

这没有用。答案建议,我*&window改为用作函数参数,效果很好。*&window我将to重写**window为:

void init_window(SDL_Window **window)
{
    *window = SDL_CreateWindow(…);
}

int main(void)
{ 
    SDL_Window  *window;
    init_window(&window);
}

它也有效。但我仍然不明白为什么第一个版本不起作用。我查看了SDL_Window 的实现细节,typedef将它放入普通命名空间只是一个正常的结构。SDL_CreateWindow返回SDL_Surface *.

为了描绘我的困境,我编写了这个简单的程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Person
{
    char *name;
    int age;
} Person;

Person *person_create(char *name, int age)
{
    Person *who = malloc(sizeof(Person));
    who->name   = strdup(name);
    who->age    = age;

    return who;
}

void person_get_old(Person *who)
{
    who->age += 30;
}

int main(void)
{
    Person *susan = person_create("Susan", 23);
    person_get_old(susan);
    printf("%i\n", susan->age);
}

53这就像预期的那样打印,而我不必使用指向指针语义的指针。我的实现与 SDL2 的实现有什么区别。这不是 SDL2 问题,因为回答我上一个问题的人可以在不了解 SDL2 的情况下回答这个问题,所以我似乎错过了一些实现细节。希望有人能启发我。

4

2 回答 2

3

这是一个更简单的示例来说明:

void foo(int p) //create new copy of int
{
    p = 0; //modify copy, original is unchanged
}
void bar(int* p) //create new copy of pointer
{
    *p = 0; //modify object pointer is set to
}

在您的 SDL 示例中,您尝试执行foo. 目标是将指针设置为新值。但是,您只复制了指针,并且对副本进行了所有更改。

在您的Person示例中,您正在执行bar. 你有一个被指向的对象,你想修改它。正确的方法是通过指针(或引用)传递它。

由于您有一个要修改的对象,因此您需要通过指针(或引用)传递它。由于该对象本身是一个指针,因此它将是一个指向指针的指针。

于 2016-02-21T06:02:51.283 回答
3

您的实现与 SDL2 的实现之间的区别在于,在您的实现中返回一个指针,而调用代码将其分配给一个变量。

在 SDL2 实现中,被调用函数想要存储指针,并且您希望它存储在调用代码定义的现有指针中。它需要知道在哪里存储指针,所以它需要一个指向指针的指针。

于 2016-02-21T05:58:26.667 回答