Итак, я хочу, чтобы pTargets
указывал на постоянную память и сам был const
,
это было бы int const *const pTargets = /* assigned once */
. Далее я
хочу объявить ppTargets
, что ppTargets
само может быть назначено, но
тогда *ppTargets
можно прочитать только.
К сожалению, это не имеет смысла. Ваш пример кода присваивает *ppTargets
, что действительно является основной целью функции foo()
. Если *ppTargets
может быть назначен один раз, то он может быть назначен снова.
Неясно, почему вы хотите, чтобы foo()
local pTargets
был const
, а не просто не изменял его, но вы можете присвоить значение const
объекту соответствующего не- const
-квалифицированный тип. Таким образом, то, что вы на самом деле ищете, может быть
int foo(int const **ppTargets) {
int const * const pTargets = /* calculate here */;
*ppTargets = pTargets;
return 37; // just e.g.
}
И это, кажется, согласуется с вашим предполагаемым использованием:
Другими словами, в коде вызова я хочу:
int const* pTargets;
foo(&pTargets);
Для любого типа T
тип указателя на T
может быть записан T *
. В частности, типом этого &pTargets
является int const **
(выглядит знакомо?), И это соответствующий тип для параметра функции, с помощью которого функция должна иметь возможность установить значение pTargets
.
вызывающей стороны.
И снова, вызывая foo()
, чтобы установить значение вызывающего абонента pTargets
, похоже, это как раз и есть точка. Если бы foo()
было запрещено делать это, то идеальным подходом было бы передать сам pTargets
(по значению), вместо того, чтобы передавать его адрес и спорить const
квалификаторы.