无法理解将 SDL_Surface 结构的像素成员转换为 (Uint32*) 的 C 样式

Trouble understanding C style casting the pixels member of a SDL_Surface structure into a (Uint32*)

我目前正在学习 SDL。这是我试图理解的一个程序。

(我删除了很多代码,比如事件轮询,以缩短它。)

SDL_Surface* backbuffer = NULL;
bool ProgramIsRunning();
void DrawPixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b);

int main(int argc, char* args[])
{
    SDL_Init(SDL_INIT_EVERYTHING);

    backbuffer = SDL_SetVideoMode(800, 600, 32, SDL_SWSURFACE);

    SDL_WM_SetCaption("Pixel Plot", NULL);

    while(true)
    {
        for(double i = 0; i < 100; i++)
        {
            DrawPixel(backbuffer, rand() % 800, rand() % 600,
                      rand() % 255, rand() % 255, rand() % 255);
        }
        SDL_Flip(backbuffer);
    }
    SDL_Quit();
}

void DrawPixel(SDL_Surface *surface, int x, int y, Uint8 r, Uint8 g, Uint8 b)
{
    if(x >= surface->w || y >= surface->h)
    {
        return;
    }

    Uint32 color = SDL_MapRGB(surface->format, r, g, b);

    Uint32* buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;

    (*buffer) = color;
}

我的问题是这一行:

buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;

我将这一行读作,获取所有这些东西,对其求值,将其转换为一个指向 32 位整数的指针,(一个包含所有东西求值的 32 位整数的内存地址)最后给出缓冲区的内存地址。

所以缓冲区现在指向一个包含 32 位整数的内存地址,对吗?

现在,真正让我难过的是程序立即用 Uint32 颜色覆盖该值。

那么,转换所有这些东西并将其存储在缓冲区中有什么意义呢?

有问题的行对程序有什么影响,因为没有它就不能工作?

这一行:

Uint32* buffer = (Uint32*)surface->pixels + y * surface->pitch / 4 + x;

定义一个类型为Uint32*的变量,并为其赋值上述表达式的值。表达式将 surface->pixels 转换为 Uint32* 并为其添加偏移量。所以 buffer 指向 surface->pixels.

内部的某个位置

这一行:

(*buffer) = color;

取消引用 buffer 并将 color 分配给取消引用的指针。也就是说,color的值放在了buffer指向的内存位置。 buffer 未被覆盖。 buffer指向的是