Краткое резюме:
const T *p; // p is writable, *p is not
T const *p; // same as above
Выражение *p
имеет тип const T
, поэтому вы не можете присвоить новое значение *p
(вы не можете писать в вещь p
указывает на). Однако вы можете присвоить новое значение p
, установив его так, чтобы оно указывало на другой объект const T
. p
- это не const
указатель на const
объект.
T * const p; // *p is writable, p is not
Выражение *p
имеет тип T
, поэтому оно доступно для записи - вы можете обновить значение какого p
указывает на. Однако указатель p
сам по себе имеет тип T * const
, поэтому он не может быть записан в - вы не можете установить p
для указания на другой объект. p
- это указатель const
на объект, отличный от const
.
const T * const p; // neither p nor *p are writable
T const * const p; // same as above
В этом случае *p
имеет тип const T
, а p
имеет тип const T * const
- ни может быть написано p
- это указатель const
на const
объект.
В данном конкретном случае:
const PowerManStateType* const pfPowerManStates = &(pfStates[0]);
pfPowerManStates
указывает на первый элемент массива, который выглядит как указатель на функцию. Поскольку pfPowerManStates
сам по себе является указателем, вы можете использовать оператор []
для него как массив и, таким образом, читать элементы из массива. Однако вы не можете изменить ни один из элементов с помощью pfPowerManStates
, и при этом вы не можете установить его так, чтобы он указывал на другой объект.