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

时间:2016-02-07 14:38:07

标签: c sdl

我目前正在学习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颜色覆盖该值。

那么,那么将所有这些东西投射并将其存储在缓冲区中的重点是什么?

问题线甚至会对节目产生什么影响,因为没有节目就行不通?

1 个答案:

答案 0 :(得分:0)

这一行:

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指向的是什么。