无法理解将 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
指向的是
我目前正在学习 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
指向的是