эти две декларации
float *pointer[10];
float *(pointer[10]);
эквивалентны. Вы можете написать даже следующим образом
float *( ( pointer )[10] );
То есть это объявление массива из 10 указателей для плавания.
Эти декларации
int(*pointer_function)();
int *pointer_function();
разные. Первый объявляет указатель на функцию типа int()
. Второй объявляет функцию (не указатель на функцию) с типом int *()
.
Вот демонстрационная программа
#include <iostream>
int * pointer_function() // #1
{
static int x = 1'000'000;
return &x;
};
int f1() // #2
{
return 2'000'000;
}
int main()
{
std::cout << *pointer_function() /* calling #1 */<< '\n';
int( *pointer_function )() = f1;
std::cout << pointer_function() /* calling #2 */ << '\n';
return 0;
}
Его вывод
1000000
2000000
Чтобы сделать более очевидной разницу между объявлениями, вы можете переписать второе объявление (то есть объявление функции) следующим образом
int * ( pointer_function )();
Сравните это с указателем на объявление функции
int ( *pointer_function )();
Учтите, что декларатор может быть заключен в скобки.