CS50过滤器RGB三重表示法

CS50过滤器RGB三重表示法,c,pointers,cs50,C,Pointers,Cs50,问题更新: 在CS50的filter.c中,图像定义为RGBTRIPLE(*image)[width]=calloc(height,width*sizeof(RGBTRIPLE)) 这个符号在讲座中没有涉及,令人困惑。我知道calloc正在为图像中的所有像素分配内存,但为什么使用()以及为什么不将其定义为RGBTRIPLE image[height][width]图像[高度][宽度]是一个固定变量,您无法为其分配内存。所以你需要一个指针,你可以给它分配内存。这就是“图像是指向“宽度”RGB三元组

问题更新:

在CS50的filter.c中,图像定义为
RGBTRIPLE(*image)[width]=calloc(height,width*sizeof(RGBTRIPLE))


这个符号在讲座中没有涉及,令人困惑。我知道calloc正在为图像中的所有像素分配内存,但为什么使用()以及为什么不将其定义为
RGBTRIPLE image[height][width]

图像[高度][宽度]
是一个固定变量,您无法为其分配内存。所以你需要一个指针,你可以给它分配内存。这就是“图像是指向“宽度”RGB三元组数组的指针。”

calloc
调用为这些东西分配了一个高度数组,因此您可以执行
image[1]
以获取下一行,执行
image[1][0]
以获取第二行的第一个像素点


你问你是否可以用
RGBTRIPLE*image;
image=calloc(…
),是的,你可以做。但是不,你不能做
image[1][0]
,因为编译器不知道行的大小。这就是我的意思,你现在必须自己做所有的索引:
image[1*width+0]
是第二行的第一个像素点。

那么为什么不将image[]]=calloc…或image=calloc…或者您只能为指针分配内存?image[]=calloc…有效吗?索引管理与我可以访问image相同[I][[j]不是image[1][0]还有第二行的第一个像素?所以真的没有额外的索引管理..啊,但你是说你不能这样做,因为编译器不知道行的大小。啊,现在我几乎理解了图像的定义为
RGBTRIPLE*image;
你不能使用
image[1][0]
因为编译器不知道行大小,但是使用定义
RGBTRIPLE(*image)[width]
编译器知道行大小。Comprendez-vous?但是,等等,为什么不直接定义RGBTRIPLE-image[height][width];根本不需要执行callocthen@DCR,是的,很好,除了可能会耗尽堆栈空间。甚至“可能”对于大型图像,“我可以传递
&image
?”与
image[height][width]
一起传递吗?它已成为驻留在堆栈上的局部变量。您可以将其传递给调用的另一个函数,但无法返回,因为一旦函数返回,它就不再存在。