объявление const указателя против объявления const целого числа

#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;