Здравствуйте, я изучаю 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', её значение нельзя как менять, так и я так понимаю менять указатель этой переменной.
Просто если еще использовать указатели и ссылки, то я вообще что-то честно говоря очень путаюсь. Хотя я понимаю принцип работы указателей и функций. Понимаю их разницу. Но из-за маленького опыта в разработке чего-либо (я только обучаюсь), происходит вот такая путаница. Я буду крайне благодарен добрым людям которые подскажут правильно ли я считаю, если да то систематизируют мои мысли для простоты понимания, или укажут на ошибку и пояснят.
C/C++
В чем разница принимаемых аргументов C++?
Правило верно для указателей.
Указатель на константу не позволяет изменять значение на которое указывает указатель, но позволяет изменять адрес самого указателя, что позволяет использовать адресную арифметику. То есть
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; // Нельзя!
Эти правила распространяются и на объявленные формальные параметры в функциях и методах, и, естественно, применимы к передаваемым аргументам при вызовах.
Указатель на константу не позволяет изменять значение на которое указывает указатель, но позволяет изменять адрес самого указателя, что позволяет использовать адресную арифметику. То есть
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; // Нельзя!
Эти правила распространяются и на объявленные формальные параметры в функциях и методах, и, естественно, применимы к передаваемым аргументам при вызовах.
Санек Соколов
для себя использую
Запоминай проще:
- переменную НЕЛЬЗЯ изменить, если она передана параметром int const A или const int A
- переменную МОЖНО изменить, если она передана указателем int *A
- переменную НЕЛЬЗЯ изменить, если она передана параметром int const A или const int A
- переменную МОЖНО изменить, если она передана указателем int *A
Колян Францев
В первом же случае явно разница какая-то есть, ведь 'const' не в одном и том же месте находится
Насколько я помню у Страуструпа в книге по с++ объяснение такое - const относится только к содержимому переменной. То есть она ПОСТОЯННА, а применять const к типу бессмысленно. Существует приведение типов и оно работает всегда и должно работать при переводе int в double и наоборот например
Колян Францев
Хмм, раз бесмысленно, почему компилятор никакую ошибку не выдает? Разве это ни на что не влияет?
Похожие вопросы
- В чем разница между C и C++?
- В чем разница между C++ xCode и C++ VisualStudio?
- Какие из этих книг вы посоветуете прочесть в первую очередь чтобы повысить свои знания в C/C++?
- Ошибка C2664: невозможно преобразовать аргумент 1 из "const char [6]" в "char *" в C ++
- Задача по C++
- День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)
- Программирование C++ ПРОШУ ПОМОЧЬ!
- Почему создатель Linux Линус Торвальдс называет C++ ужасным языком, а ядро ОС Linux пишется только на Си?
- Задача на C++ (Остатки).
- Сделать перестановку чисел с помощью функции в C++, но у меня получается чепуха