A pointer to a vector should stay stable during the life time of the vector. A pointer to an element in the vector is subject to change as the vector grows to accomodate more elements (and therefore has to move its contents in memory). I.e. the "header" of the vector stays where it is in memory, the content may move.
I seem to have just confirmed this empirically, I just wanted to make sure that my concept of this was accurate.
Test code:
std::vector<std::string> vec {21, "Element"};
std::vector<std::string> *ptr_v = &vec;
std::string *ptr_el = &vec.at(20);
std::cout << "Before: &vec: " << &vec << " *vec: " <<
ptr_v << " *element 20:" << ptr_el << std::endl;
for(int i = 0; i < 100000; i++)
vec.push_back("Element");
std::vector<std::string> *ptr_v_a = &vec;
std::string *ptr_el_a = &vec.at(20);
std::cout << "After: &vec: " << &vec << " *vec: " <<
ptr_v_a << " *element 20:" << ptr_el_a << std::endl;