В этом вызове функции
func(&vect[0]);
выражение аргумента имеет тип int *
, в то время как параметр функции имеет тип std::vector<int> *
void func(vector<int> *vect)
, и не существует неявного преобразования от одного типа к другому.
По сути, объект типа std :: vector уже является указателем, заключенным в класс. Таким образом, передавая объект типа std :: vector по ссылке, вы фактически одновременно передаете указатель на выделенный массив, на который внутренне указывает вектор.
Обратите внимание, что в первой программе, представленной в вашем вопросе, вы передаете векторное значение вектора по значению.
void func(vector<int> vect)
{
vect.push_back(30);
}
Таким образом, функция не изменяет исходный объект, переданный функции. Если вы хотите изменить исходный объект, тогда параметр функции должен иметь ссылочный тип, например,
void func(vector<int> &vect)
{
vect.push_back(30);
}
Нечто похожее, что вы имеете в виду, сделано для стандартного класса std::string
в C ++ 17. Это класс std::string_view
. Вы можете передать указатель на первый элемент объекта типа std :: string, как вы это делаете с массивами. Но вам также нужно передать длину массива символов, на который указывает указатель.
Вот демонстрационная программа.
#include <iostream>
#include <string>
#include <string_view>
void func( std::string_view s )
{
std::string reversed_string( s.rbegin(), s .rend() );
std::cout << reversed_string << '\n';
}
int main()
{
std::string s( "Hello" );
func( { &s[0], s.size() } );
}
Ее вывод
olleH