float * image
只需指向一个浮点数。它也可以与数组语法一起使用——即image[n] 从图像的位置获取第n 个浮点数。人们将使用指针和 malloc 来创建浮点数的动态数组。但是,没有与数据本身存储的大小相关的信息。这是编码人员在 C 中必须关心的一个细节。通常在 C 中的这种情况下,当您在函数中传递这样一个指针时,您还会传递一个伴随的大小,即:
void Foo(float* image, size_t numFloatsInImage)
听起来image 可能指向一个被视为二维数组的连续内存块。那是有宽度和高度的东西。因此,您可能会有类似“3x3”图像的东西,而不是严格的 numberOfFloats:
图像-> 0 1 2 3 4 5 6 7 8
0 0 0 1 1 1 2 2 2
这里总共有 3x3 == 9 个浮点数,前 3 个对应第 1 行,后 3 个对应第 2 行,最后一个对应第 4 行。这只是一个用于表示 2d 数据的一维数组。
就像我之前所说的,这是您决定如何使用该语言的细节,而不是它的一部分。您必须使用指针传递宽度/高度以安全使用:
void Foo(float* image, size_t width, size_t height)
您也可以通过简单地创建一个结构来存储您的图像来避免这种情况,确保始终正确初始化/维护宽度和高度
struct
{
float* image; // points to image data
size_t width;
size_t height;
};
然后总是将结构传递给像 foo 这样的函数
另一个技巧可能是过度分配浮点数以将宽度和高度存储在缓冲区本身中:
float* image = malloc(width*height + 2);
image[0] = width;
image[1] = height;
// everything past image[2] is image data
在任何情况下,都有这些和许多其他特定于实现的方法来存储/传递这些数据。给你这个指针的人应该告诉你如何获得长度/高度并告诉你如何使用指针。 C 无法弄清楚它是如何完成的,它是一个实现决策。