C/C++

В чем разница принимаемых аргументов C++?

Здравствуйте, я изучаю C++, собственно я смотрел видео, читал по теме указателей и ссылок.

Вопрос: В чем разница принимаемых аргументов в функцию?

void Foo(const int size1,int const size2, const int const size3)
{

}

В моем понимании, т. е. допустим переменные size1,size2,size3.
Их три, потому что они немного различаются в параметрах.
Как я это понимаю:
1)Первый аргумент, 'const' стоит перед int, получается нельзя изменять само значение.
Т. е. в функции нельзя будет написать size1 = 5; Или что то тому подобное
2)Второй аргумент 'const', стоит перед size2, значит наверное нельзя менять указатель? Я не понимаю вот этого момента. Но в любом случае можно менять значения, т. к. перед Int нету слова 'const'. Я не знаю просто можно ли сделать допустим так, то что вне функции мы создадим указатель. и в самой функции значения которые мы передали. Присвоить переменной size2, тот указатель. Я думаю для этого и стоит перед size2 тип 'const'.
3)Ну а третья переменная 'size3', её значение нельзя как менять, так и я так понимаю менять указатель этой переменной.

Просто если еще использовать указатели и ссылки, то я вообще что-то честно говоря очень путаюсь. Хотя я понимаю принцип работы указателей и функций. Понимаю их разницу. Но из-за маленького опыта в разработке чего-либо (я только обучаюсь), происходит вот такая путаница. Я буду крайне благодарен добрым людям которые подскажут правильно ли я считаю, если да то систематизируют мои мысли для простоты понимания, или укажут на ошибку и пояснят.
Правило верно для указателей.

Указатель на константу не позволяет изменять значение на которое указывает указатель, но позволяет изменять адрес самого указателя, что позволяет использовать адресную арифметику. То есть

int x = 8;
const int* pa = &x;
*pa = 15; // Нельзя!
x = 15; // Можно!
int y = 25;
int* ptr = &y;
pa = ptr; // Можно!

Константный указатель наоборот позволяет изменять значение на которое он указывает, но запрещает изменять хранимый адрес, что запрещает использовать адресную арифметику.

int x = 8;
int* const pb = &x;
*pb = 15;
int y = 25;
int* ptr = &y;
pb = ptr; // Нельзя!
ptr = pb; // Можно!!!
*pb = *ptr; // Можно!

Константный указатель на константу запрещает и первое и второе.

int x = 8;
const int* const pc = &x;
*pc = 15; // Нельзя!
int y = 25;
int* ptr = &y;
pc = ptr; // Нельзя!
ptr = pc; // Нельзя!
*ptr = *pc; // Нельзя!

Эти правила распространяются и на объявленные формальные параметры в функциях и методах, и, естественно, применимы к передаваемым аргументам при вызовах.
Рамис Мустафин
Рамис Мустафин
85 866
Лучший ответ
Санек Соколов для себя использую
Запоминай проще:

- переменную НЕЛЬЗЯ изменить, если она передана параметром int const A или const int A

- переменную МОЖНО изменить, если она передана указателем int *A
Виталий Арнаут
Виталий Арнаут
37 945
Колян Францев В первом же случае явно разница какая-то есть, ведь 'const' не в одном и том же месте находится
Насколько я помню у Страуструпа в книге по с++ объяснение такое - const относится только к содержимому переменной. То есть она ПОСТОЯННА, а применять const к типу бессмысленно. Существует приведение типов и оно работает всегда и должно работать при переводе int в double и наоборот например
Сергей Vfr
Сергей Vfr
21 700
Колян Францев Хмм, раз бесмысленно, почему компилятор никакую ошибку не выдает? Разве это ни на что не влияет?