One thing I find helpful in these situations is to use type definitions. Here are a couple types I would define in this situation :
typedef struct Foo * pFoo;
typedef std::vector<pFoo> vecpfoo;
Then I would adjust your functions to this :
void reportFoo( int index, pFoo pf )
{
cin << "Foo item: " << index << endl;
cin << "Member s: " << pf->s << endl;
cin << "Member i: " << pf->i << endl;
}
void reportFooVector( vecpfoo & vpf )
{
int count = (int)vpf.size();
for( int i; i < count; ++i )
reportFoo( i+1, vpf[i] );
}
and I would rewrite the main function like this:
int main()
{
struct Foo foo = { "foo", 5 };
struct Foo goo = { "goo", 10 };
vecpfoo vf;
vf.push_back( &foo );
vf.push_back( &goo );
reportFooVector( vf );
}