#c #vector #parameter-passing #pass-by-reference
#c #вектор #передача параметров #передача по ссылке
Вопрос:
Я знаю, что когда вы передаете массив в качестве параметра, вы в основном передаете адрес массива с индексом 0. Затем аппаратное обеспечение знает, что int обычно составляет 4 байта, поэтому оно может легко получить доступ к другим элементам. Мой вопрос о векторе. Если у меня есть функция
void bla(std::vector<int> amp;arr)
{
}
Затем он должен передать ссылку на вектор, но происходит ли это как с массивами?
Векторы реализованы с использованием массивов, поэтому я предполагаю, что когда я передаю ссылку, она просто передает адрес первого элемента. Это правильно или нет?
Кроме того, если я передам просто как вектор, что произойдет? Создаст ли это копию в стеке? Спасибо
Ответ №1:
std::vector
сильно отличается от необработанного массива в стиле C, поэтому, если вы передаете std::vector
по ссылке, никто не может сказать, что адрес первого элемента в том std::vector
, что передается в функцию.
Внутри std::vector
есть больше логики, чем просто «необработанный массив в стиле C».
Если вам нужен адрес первого элемента в векторе, вы можете получить его с помощью amp;v[0]
или v.data()
.
Если вы передаете вектор по значению, вы получаете копию исходного вектора. И все изменения, которые вы вносите в эту копию внутри вашей функции, не отражаются на оригинале.
Комментарии:
1. Хорошо, поэтому, когда я передаю вектор по ссылке, я передаю некоторый адрес, а затем аппаратное обеспечение может каким-то образом получить вектор, используя только один адрес, правильно?
Ответ №2:
В общем:
void foo(Bar b)
— передача по значению,b
является копией или оригиналомBar
.void foo(Baramp; b)
— передача по ссылке, вы можете изменить оригиналBar
черезb
.void foo(Bar* b)
— передача по указателю, вы можете изменять оригиналBar
черезb
(до тех пор, покаb
не равно null).void foo(const Baramp; b)
— передача по ссылке const,b
является исходнойBar
, но вы не можете изменить ее в области видимостиfoo
.void foo(const Bar* b)
— передача по указателю на const,b
является указателем на оригиналBar
, но вы не можете изменить его в области видимостиfoo
.void foo(Bar* const b)
— передача по указателю const ,b
является указателем на оригиналBar
, и оригиналBar
может быть изменен (еслиb
он не равен null), но вы не можете изменить, на чтоb
указывает.void foo(const Bar* const b)
— передача по указателю const на const, вы не можете изменить оригиналBar
и не можете изменить то, чтоb
указывает на область видимостиfoo
.
Ответ №3:
Если вы передаете вектор по ссылке, передается весь массив, и его можно редактировать. Он не передает адрес первого элемента. В противном случае, если вы не передаете по ссылке, создается только копия массива.
Источник: школьный опыт программирования (пожалуйста, отредактируйте, если это неточно).