Другие языки программирования и технологии
(С++) чем отличается такая запись 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++ ты не можешь определить две переменные с одним и тем же именем (в одном и том же блоке).
Как-то так...
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++ ты не можешь определить две переменные с одним и тем же именем (в одном и том же блоке).
Как-то так...
Александр Сикора
почему делает неизменяемый тип слева?? я когда объявлял переменную хранившую размер статического массива я писал 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++ ты не можешь определить две переменные с одним и тем же именем (в одном и том же блоке).
Как-то так...
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 - твое все!
Похожие вопросы
- (С++) чем отличается такая запись int* const arr от такой int *arr?
- Написать реализацию перегруженных функций: int func (int * arr, int length); int func (double * arr, int length);
- Чем отличается в языке С++ объявление указателя на переменную int *a от int* a?
- Чем отличается в c++ int main() от void main()???
- Что значит возвращение и невозвращение значения функции? И чем отличается void от int?
- [c++] не работает long int переменная объявленная как long int a; занимает всего 4 байта ((( Что может быть не так?
- C# Почему const uint SIZE не воспринимается массивом, как константа, а int работает? Погрешности с double
- для чего в языке С ++ используется функция const?
- Как осуществить операцию сложения в с++ без операции присваивания ? int a=5; int b=6; int c=a+b; ( без "= ")
- C++ как переменную (signed int) разделить на старший и младший байт, а после записать в 2е другие переменные типа char?