#c #variables #memory #constants #pc-lint
#c #переменные #память #константы #pc-lint
Вопрос:
Кто-нибудь может объяснить мне, в чем разница между двумя блоками кода ниже:
func1 (...)
{
int32_t index;
const int32_t *p;
p =amp; (index);
}
func2 (...)
{
const int32_t s;
s=10;
}
Можно объявить const указатель, а затем присвоить ему значение, но невозможно объявить обычную переменную, а затем присвоить ей значение. Кто-нибудь может мне это объяснить?
Я получаю ошибку pc-lint, что я должен объявить переменную const внутри функции, но я не могу этого сделать. Как я могу избавиться от этой ошибки?
Большое вам спасибо.
Комментарии:
1. Вы можете добавить «number_of_stars 1»
const
к объявлению;const
применяется ко всему, что находится непосредственно справа:int [const] * [const] * ... [const] foo = value;
2.
const int32_t s; s = 10;
ошибка компилятора…int32_t * const p; p = NULL;
ошибка компилятора
Ответ №1:
Это потому, что они не делают одно и то же (используя T
как тип, поскольку я в основном ленив):
const T *p; // non-const pointer to const T.
const T s; // const T.
Это может помочь думать о первом как о связывании, подобном [const T] [*p]
.
Если вам нужен const
указатель, вы делаете это с помощью одного из:
T * const p; // const pointer to non-const T, [T*] [const p]
const T * const p; // const pointer to const T, [const T*] [const p].
Ответ №2:
int i=0;
const int *p=amp;i;
*p = 10; /*error*/
Это incorrect
потому, что p объявлен pointer to constant int
, поэтому вы не можете изменить целочисленное значение, на которое указывает p, через p .
int i=0;
int const *p=amp;i;
*p = 10; /* i will be 10 */
Это correct
потому, что объявлен p constant pointer to int
, поэтому вы можете изменить целочисленное значение, на которое указывает p, через p .
int i=0;
const int const *p;
p = amp;i; /*error*/
*p = 10; /*error*/
Это incorrect
потому, что p объявлен constant pointer to constant int
, поэтому вы не можете изменить ни целочисленное значение, на которое указывает p, через p, ни значение p после его объявления.
Ответ №3:
«Можно объявить
const
указатель, а затем присвоить ему значение …»
const int32_t *p
не является const
указателем на int32_t
. Это не const
указатель на const
int32_t
.
int32_t * const p;
дало бы вам const
указатель на int32_t
. Позаботьтесь о том, чтобы const
спецификатор находился в правой части *
декларатора.
Вы можете изменить сам указатель так, как хотите, потому что это не так, const
поэтому p = amp;(index);
все в порядке. Обратите внимание, что скобки являются избыточными.
«… но невозможно объявить обычную переменную, а затем присвоить ей значение».
const int32_t s;
не является «обычной изменяемой» переменной. Оно объявляется с помощью const
. Вы не можете назначить const
переменную после ее определения / инициализации. Вы можете инициализировать его только один раз при его определении.
Таким образом, используя
const int32_t s;
s = 10;
выдает вам, конечно, ошибку.
Как я могу избавиться от этой ошибки?
Инициализируйте s
его определение:
const int32_t s = 10;