Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

const float* a и float* const b

#c


Понимаю: если const находится слева от * , то данные константа.
Если const находится справа от * , то указатель константа.

Вопрос : что означает, что указатель константа?
    Пишу следующее:

int main()
{
    const float* a;
    float g = 5;
    float* const b=(float*)malloc(g*sizeof(float));
    b[0] = 6.4; // на это спокойно реагирует
    float* k = b++; //инкремент не работет
    return 0;
} 


Почему же инкремент не работает ?Что означает, что указатель константа?
    


Ответы

Ответ 1



Понимаю: если const находится слева от * , то данные константа. Если const находится справа от * , то указатель константа. Некоторые C-программисты предпочитают следующий стиль объявления переменных (обратите внимание на первый квалификатор const: он стоит после float): float const * const * var В таком случае становится легко применять правило чтения «справа-налево»: var | переменная var — это * var | указатель на const * var | константный * const * var | указатель на const * const * var | константный float const * const * var | float Впрочем этим правило можно пользоваться независимо от выбранного стиля. Вопрос: что означает, что указатель константа? Это означает, что вы не можете изменять этот указатель! Смотрите, в чем дело. char num = 10; char * const ptr = # Здесь у нас есть две переменных: num — переменная типа char. В ячейке памяти, выделенной для этой переменной хранится число 10. ptr — константный (неизменяемый) указатель на изменяемые данные типа char. ptr «указывает» на переменную num, т. е. в области памяти, выделенной для ptr хранится адрес переменной num. ptr — неизменяемый указатель, это значит, что мы не можем сделать так, чтобы ptr указывал в какое-то другое место кроме num. Он всегда будет указывать на num и повлиять мы на это не можем (законными путями)! ptr — неизменяемый указатель на изменяемые данные, это значит, что сами данные, на которые указывает ptr мы изменить можем (т. е. можем изменить значение переменной num).

Ответ 2



Во-первых, в языке С const объекты не принято назвать словом "константа". Термин "константа" в языке С означает совсем другое. 42 - это константа, 3.14 - тоже константа, ваше b - не константа, а const указатель. Во-вторых, в данном случае то, что указатель объявлен как const означает, что значение указателя нельзя модифицировать. Инкремент "не работает" потому, что инкремент пытается модифицировать указатель.

Комментариев нет:

Отправить комментарий