Lets say you have this as a struct you want to store in your vector.
Code:
struct foo {
size_t stringLen;
char *stringPtr;
};
Where stringPtr points to a block of allocated memory, and stringLen is the length of that memory.
If you take the simple case of just block copying the memory, you won't be taking into account the special nature of the pointer. You've have two copies of the foo object (one in your vector, and one outside), but only one block of allocated memory. This will create all sorts of difficulties, because the external copy has to be maintained as a read-only copy (you can't realloc stringPtr for example). Nor can you properly destroy the external copy without trashing the copy in your vector.
So perhaps you have
Vector_create( size_t size, void *(*copyFn)(void*,void*,size_t) )
where size is the size of the structure you want to store, and copyFn (which could be memcpy in the simple case) is a function that knows how to make a decent copy of some deeply nested structure.
You can extend this idea to your complicated "store pointers only" idea by also supplying your Vector_create function with a 'free' function that knows how to properly delete a deeply nested structure (which may just be free() itself in the simple case).
Are you intending to give users the raw base pointer and let them do whatever they want using [subscript] notation on that pointer?
Or will you provide get/set methods via some kind of opaque pointer to preserve stored value semantics.
You definitely need to think about what happens when you store nested structures, because you'll either have lots of memory leaks or lots of references to non-existent memory if you get it wrong.