У меня есть функция, которая принимает указатель, и я случайно объявил ее константной. Функция изменяет значение указателя (намеренно) - фактический указатель, а не данные, на которые указывает указатель.
Я задавался вопросом, почему это не создает предупреждение....
static void CalcCRC(const uint32_t *pData, uint8_t noWords)
{
// Do some other stuff....
pData = pData + noWords;
// Do some other stuff....
}
pData = pData + noWords;
— это совершенно законная вещь, которую можно сделать самостоятельно. Это может не иметь смысла в контексте вашего кода, но компилятор не может (и не должен) понимать ваши намерения.
uint32_t
, так что придется проявить немного фантазии).
Объявление const uint32_t *pData создает указатель на const uint32_t, что означает, что указатель указывает на const, а не на сам указатель, поэтому изменение указателя является законным.
Если вы сделали что-то вроде этого:
*pData = 0;
Тогда вы получите сообщение об ошибке при изменении типа const.
Декларация
const uint32_t *pData;
Сделает *pData константой, но не pData саму себя. Другими словами, то, на что ссылается указатель, считается константой (при доступе через указатель), но сам указатель не является константой.
Если вы хотите, чтобы сам указатель был константным, вы должны написать
uint32_t * const pData;
Вместо.
Если вы хотите сделать сам указатель и то, что указатель указывает на const, вам следует использовать следующее объявление:
const uint32_t * const pData;
Учитывая static void CalcCRC(const uint32_t *pData, uint8_t noWords)
указатель, и я случайно объявил его константным. Функция изменяет значение указателя...
Это, указатель, не const.
Данные, на которые он указывает, — это const, поэтому изменение самого указателя не является поводом для предупреждения.
uint32_t *pData; // Neither const
const uint32_t *pData; // Referenced data is const
uint32_t * const pData; // Pointer is const
const uint32_t * const pData; // Referenced data and pointer are const
См. «Правило спирали/по часовой стрелке»