Регистрация
4 Авг 2013
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
есть функция которая принимает массив func(int *numbers) и есть фукнция которая принимает вектор func(vector<int>& numbers), почему в случае массива надо ставить звездочку, а в случае вектора амперсанд? в чем разница?
 
Разница между указателем и ссылкой состоит в следующем:

• Указатель может быть неинициализированным или равным nullptr, а ссылка всегда должна быть связана с существующей переменной при создании
• Указатель может менять свое значение, то есть указывать на разные переменные в разное время, а ссылка не может
• Указатель имеет свой адрес в памяти, а ссылка не имеет
• Указатель может быть частью массива или структуры, а ссылка не может
• Указатель поддерживает арифметику указателей, то есть можно прибавлять или вычитать целые числа от указателя, чтобы получить адрес смещенный на определенное количество элементов. Ссылка не поддерживает арифметику
• Указатель использует оператор * для разыменования, то есть получения значения по адресу, и оператор & для получения адреса переменной. Ссылка использует тот же синтаксис, что и обычная переменная
 
потому что * - знак указателя, а & - ссылки. зачем передавать адрес вектора если можно сразу передать обьект вектора, а также зачем передавать ссылку на массив если тогда ты даш ссылку только на 1 элемент. А указатель передает адрес массива, и тем самым в цикле ты сможешь обращаться к самим элементам так - указатель[индекс]
 
В C++ массивы и векторы обрабатываются немного по-разному.

Когда вы объявляете функцию, которая принимает массив int *numbers, вы фактически указываете функцию, которая принимает указатель на первый элемент массива. Это необходимо, потому что массивы в C++ деградируют до указателей, когда они передаются в функции. Важно отметить, что в этом контексте функция не знает размер переданного массива.

На другом конце, std::vector<int>& numbers означает, что функция принимает ссылку на вектор чисел. Использование амперсанда (&) здесь означает передачу ссылки, что позволяет функции взаимодействовать с исходным вектором, а не его копией. Передача по ссылке также обеспечивает доступ к нескольким методам вектора, таким как size(), push_back(), и т. д. которые не доступны при передаче массива.

В общем, основное различие здесь заключается в том, что передача массива непосредственно не сохраняет его исходный размер и представляет собой указатель на первый элемент, тогда как передача вектора по ссылке позволяет сохранить все его свойства, включая размер, и изменять исходный вектор.
 
Указатель в некотором плане это просто намного продвинутая ссылка. Для обычных массивов он используется для динамического выделения памяти в heap.А vector придумали и используют как раз ради того чтобы долго не мучиться с указателями, так как всё автоматически делается.И, конечно, можно передавать объект в функцию не по ссылке, а по значению , что приведёт к вызову конструктора копирования . В таком случае программа будет работать относительно медленно, потому что будет создаваться копия объекта. А при передаче объекта по ссылке работа ведётся конкретно с этим объектом. Если не важно как передавать объект в функцию, то лучше - по ссылке
 
Назад
Сверху