Tak samo jak wszystko inne - zależy od typu argumentu.
// kopia
void f(int x);
void f(float x);
void f(JakasStruktura x);
void f(std::string x);
void f(std::vector<int> x);
// "przez wskaźnik" (wciąż kopia, ale... no, wskaźnika)
void f(int *x);
void f(JakasStruktura *x);
etc
// referencja
void f(int &x);
void f(std::vector<int> &x);
etc