Почему это не генерирует предупреждение или ошибку

У меня есть функция, которая принимает указатель, и я случайно объявил ее константной. Функция изменяет значение указателя (намеренно) - фактический указатель, а не данные, на которые указывает указатель.

Я задавался вопросом, почему это не создает предупреждение....

static void CalcCRC(const uint32_t *pData, uint8_t noWords)
{
    
    // Do some other stuff....

    pData = pData + noWords;

    // Do some other stuff....

}

См. «Правило спирали/по часовой стрелке»

ikegami 21.02.2023 14:56
pData = pData + noWords; — это совершенно законная вещь, которую можно сделать самостоятельно. Это может не иметь смысла в контексте вашего кода, но компилятор не может (и не должен) понимать ваши намерения.
Ayxan Haqverdili 21.02.2023 14:59
всегда полезный сайт для расшифровки такого рода объявлений (он не понимает тип uint32_t, так что придется проявить немного фантазии).
yano 21.02.2023 15:03
Руководство для начинающих по веб-разработке на React.js
Руководство для начинающих по веб-разработке на React.js
Веб-разработка - это захватывающая и постоянно меняющаяся область, которая постоянно развивается благодаря новым технологиям и тенденциям. Одним из...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Калькулятор CGPA 12 для семестра
Калькулятор CGPA 12 для семестра
Чтобы запустить этот код и рассчитать CGPA, необходимо сохранить код как HTML-файл, а затем открыть его в веб-браузере. Для этого выполните следующие...
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
ONLBest Online HTML CSS JAVASCRIPT Training In INDIA 2023
О тренинге HTML JavaScript :HTML (язык гипертекстовой разметки) и CSS (каскадные таблицы стилей) - две основные технологии для создания веб-страниц....
Как собрать/развернуть часть вашего приложения Angular
Как собрать/развернуть часть вашего приложения Angular
Вам когда-нибудь требовалось собрать/развернуть только часть вашего приложения Angular или, возможно, скрыть некоторые маршруты в определенных средах?
4
3
93
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Объявление 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

Другие вопросы по теме