float * image
Просто указывает на один поплавок.Он также может быть использован с синтаксисом массива - то есть image[n]
, чтобы получить n-е число с плавающей точкой из местоположения изображения.Люди будут использовать указатели и malloc для создания динамического массива с плавающей точкой.Тем не менее, нет никакой информации, связанной с размером, хранящимся с самими данными.Это деталь, о которой должен заботиться кодер в C. Часто в таких случаях в C, когда вы передаете такой указатель в функцию, вам также передается сопутствующий размер, например:
void Foo(float* image, size_t numFloatsInImage)
Похоже, что image
может указывать на блок непрерывной памяти, рассматриваемый как двумерный массив.Это что-то с шириной и высотой.Таким образом, вместо строго numberOfFloats у вас может быть что-то вроде этого изображения «3x3»:
image -> 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. Это просто одномерный массив, используемый для представления двумерных данных.
Как я уже говорил ранее, это деталь того, как вы решили использовать язык, а неЧасть этого.Для безопасного использования вам придется передать ширину / высоту указателем:
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 для хранения ширины и высоты в самом буфере:
float* image = malloc(width*height + 2);
image[0] = width;
image[1] = height;
// everything past image[2] is image data
В любом случае, существуют эти и многие другие специфические для реализации способы хранения / передачи этих данных.Тот, кто дает вам этот указатель, должен сказать вам, как получить длину / высоту, и рассказать, как использовать указатель.Нет никакого способа, которым C может понять, как это делается, это решение о реализации.