При объявлении переменной недопустимый код без размера массива.
a.c: In function ‘main’:
a.c:2:11: error: array size missing in ‘a’
float *a[];
При размере массива создается массив указателей.
Test:
#include <stdio.h>
int main() {
printf("float: %zu\n", sizeof(float));
printf("pointer: %zu\n", sizeof(void*));
float *a[100];
printf("float *a[100]: %zu\n", sizeof(a));
float (*b)[100];
printf("float (*b)[100]: %zu\n", sizeof(b));
printf("*b: %zu\n", sizeof(*b));
return 0;
}
Вывод:
float: 4
pointer: 8
float* a[100]: 800 // a is an array of 100 float pointers.
float (*b)[100]: 8 // b is a pointer to an array of 100 floats.
*b: 400
Обратите внимание, что в C есть особый случай, когда []
объявляет не массив, а указатель.При объявлении параметра функции:
void f(float *a[], size_t n) {
// ...
}
[]
обрабатывается как объявление указателя, поэтому оно эквивалентно:
void f(float **a, size_t n) { // ...
Поскольку массив распадается на указатель на свой первыйэлемент при передаче его в качестве аргумента функции, функция может принимать массивы:
int main() {
int n = 100;
float *a[n];
// ... Initialize the array here ...
f(a, n);
return 0;
}
Это причуды языка Си.