Другие языки программирования и технологии

(С++) чем отличается такая запись int* const arr от такой int *arr

С константой я понял, а почему звездочка в первом случае не пишется также перед указателем arr, а пишется после int и если написать ее к arr то компилятор ругается.
Для начала о константности. Слово const делает НЕИЗМЕНЯЕМЫМ тип СЛЕВА от него.

int * const и int const * - это разные вещи.
Первое - это КОНСТАНТНЫЙ указатель на int. То бишь, ты не сможешь сменить адрес, в нём хранящийся.
То есть:
int a = 5;
int b = 6;
int * const pointer = &a; // ok
pointer = &b; // ошибка. Указатель - константа. Нельзя сменить то, на что он указывает.
*pointer = 777; // теперь a = 777. Содержимое можно менять. Нельзя менять только указатель.

Второе (int const *) - это указатель на КОНСТАНТНЫЙ int. То есть, ты не сможешь сменить значение, на которое этот указатель указывает, через этот указатель.
То есть:
int a = 5;
int b = 6;
int const * pointer = &a; // ok
pointer = &b; // ok. Указатель - не константный. Ты можешь менять хранящийся в нем адрес.
*pointer = 777; // ошибка. Указатель на КОНСТАНТУ. Ты не можешь сменить значение по этому указателю через косвенное обращение. Но ты по-прежнему можешь сделать:
b = 777; // ok.

А еще есть int const * const. Это константный указатель на константный int. То есть, через этот указатель ты не сможешь сменить хранящееся значение (мало того, так еще и сам указатель сменить не сможешь).

__

Ну а во-вторых... Запись int *arr - не ошибка. Только что пробовал - компилится. int* arr, int * arr, int *arr - равнозначные вещи.
Ошибка могла быть лишь в том случае, если у тебя в одном и том же куске кода встречаются оба эти объявления. В C++ ты не можешь определить две переменные с одним и тем же именем (в одном и том же блоке).

Как-то так...
КГ
Костян Гридин
16 320
Лучший ответ
Александр Сикора почему делает неизменяемый тип слева?? я когда объявлял переменную хранившую размер статического массива я писал const int size (слева от const ничего нет :) )
Александр Сикора вот звездочку в одном случае пишу так - выдает как ошибку, в другом все нормально, как это объяснить?
Для начала о константности. Слово const делает НЕИЗМЕНЯЕМЫМ тип СЛЕВА от него.

int * const и int const * - это разные вещи.
Первое - это КОНСТАНТНЫЙ указатель на int. То бишь, ты не сможешь сменить адрес, в нём хранящийся.
То есть:
int a = 5;
int b = 6;
int * const pointer = &a; // ok
pointer = &b; // ошибка. Указатель - константа. Нельзя сменить то, на что он указывает.
*pointer = 777; // теперь a = 777. Содержимое можно менять. Нельзя менять только указатель.

Второе (int const *) - это указатель на КОНСТАНТНЫЙ int. То есть, ты не сможешь сменить значение, на которое этот указатель указывает, через этот указатель.
То есть:
int a = 5;
int b = 6;
int const * pointer = &a; // ok
pointer = &b; // ok. Указатель - не константный. Ты можешь менять хранящийся в нем адрес.
*pointer = 777; // ошибка. Указатель на КОНСТАНТУ. Ты не можешь сменить значение по этому указателю через косвенное обращение. Но ты по-прежнему можешь сделать:
b = 777; // ok.

А еще есть int const * const. Это константный указатель на константный int. То есть, через этот указатель ты не сможешь сменить хранящееся значение (мало того, так еще и сам указатель сменить не сможешь).

__

Ну а во-вторых... Запись int *arr - не ошибка. Только что пробовал - компилится. int* arr, int * arr, int *arr - равнозначные вещи.
Ошибка могла быть лишь в том случае, если у тебя в одном и том же куске кода встречаются оба эти объявления. В C++ ты не можешь определить две переменные с одним и тем же именем (в одном и том же блоке).

Как-то так...
Александр Сикора чувак ты просто гений CTRL C CTRL V - твое все!