Philippe Mori
Как вы можете видеть, ваши первые 2 функции объявляют одну и ту же функцию. Это было бы похоже на:
void g(float p[3]) { /* ... */ }
против
void g(float *p) { /* ... */ }
Вы можете вызвать любую из этих функций (предполагая, что только одна объявлена и определена) следующим образом:
float pos[3] {1.3f, 4.3f, 5.3f};
g(pos);
Таким образом, если вы хотите вызвать свои функции так, как они объявлены, вам придется сделать это следующим образом:
float *arrayOfPointers[3] = { &pos[0], &pos[1], &pos[2] };
f(arrayOfPointers);
С другой стороны, если вы хотите вызвать функцию, как в вашем коде, то вам нужно изменить объявление следующим образом:
void f(float (*p)[3]) { /* ... */ }
Таким образом, вы объявляете указатель на массив. Вместо этого вы можете использовать typedef.
Кстати, если вы используете это объявление, размер массива должен совпадать, так как он будет частью объявления.
В этот момент Вы также можете заметить, что ваше исходное сообщение об ошибке показывает вам синтаксис указателя на массив из 3 поплавков...
Бонус
В C++ вы также можете использовать ссылки. Я предпочитаю это, так как нам не нужно брать адрес массива на вызывающем сайте, и это также позволит вам гарантировать, что только массив из 3 элементов может быть передан функции.
void h(float (&p)[3]) { /* ... */ }
h(pos);
ОбновлениеМассив указателей будет иметь вид:float f1 = 1.1f, f2 = 2.2f, f3 = 3.3f;
float *arrayOfPointers[] = { &f1, &f2, &f3 };
Представление памяти будет выглядеть следующим образом:
[ &f1 | &f2 | &f3 ]
Поскольку массив эквивалентен указателю, то
float **
объявит указатель на первый элемент, который является указателем на
float
.
Указатель на массив float будет иметь вид:float arrayOfFloats[] = { 1.11f, 2.22f, 3.33f };
float (*pointerToAnArrayOfFloats)[] = &arrayOfFloats;
Представление памяти будет выглядеть следующим образом:
& [ f1 | f2 | f3 ]
Дополнительные ссылкиЭквивалентны ли указатели и массивы в языке Си? - сайт Эли Бендерского[
^]
Существует хорошее графическое представление, которое поможет вам понять разницу.C указатель на указатель, указатель на функции, массив указателей, объясненный примерами[
^]