他の答えは正しいですが、逆に機能することを付け加えたいと思います:
void RenderingEngine::Render(Visual *visuals, size_t n_visuals);
次のように呼び出すことができます。
vector<Visual> visuals;
m_renderingEngine->Render(&visuals[0], visuals.size());
最初の要素のアドレスを取得して、それが配列であるかのように渡すだけです。これは、ベクトルの要素がメモリに順番に配置されるため機能します。(コメントで指摘されているように、もちろん、これを新しいコードで使用しないでください。ベクトルを取得するメソッドを定義する方が安全で簡単です。ただし、ポインターを取得するレガシー関数が既にある場合は、これにより独自のコードでベクトルを使用するには。)
このように機能する理由は、あなたの質問 (ベクトルを受け取る関数へのポインターを渡す) の方法ではなく、実行時に配列のサイズを決定できないためです。ただし、ベクトルを構築するにはサイズを知っている必要があります。
// (wrong code)
// Passing one element:
Visual visual;
m_renderingEngine->Render(&visual);
// Passing two elements, how does Render know that
// there are two elements at that address?
Visual[2] visuals;
m_renderingEngine->Render(&visuals[0]);
Nawaz が指摘したように、C++11 でも同様のことができます。
Visual visual;
m_renderingEngine->Render( {visual} ); // C++11
にさらに要素を入れることもできます{}
。これは、コンパイラがコンパイル時に要素がいくつあるかを知ることができるためにのみ機能します。これは、次の構文糖衣です。
vector<Visual> myVec = {visual}; // C++11
m_renderingEngine->Render(myVec);
これは、クラシックのように機能します。
vector<Visual> myVec;
myVec.push_back(visual);
m_renderingEngine->Render(myVec);
(C++11 バージョンは少し最適化されているかもしれませんが、確かなことはわかりません)。