参照とポインタ

今までほぼ専らピュアなC言語ばかりやってきたもので、恥ずかしながらC++の「参照」という文法を今の今まで知らなかった。
これ、概念としてはポインタの機能限定版というか安全版というようなものだけど、書き方がちょっと混乱した。(いやむしろポインタの書き方の方が理屈に合ってない気がするんだが。)


// ポインタ
void hoge(int *x)
{
*x = 123;
}
int main(void)
{
int a;
hoge(&a);
printf("%d\n",a);
return 0;
}

// 参照
void hoge(int &x)
{
x = 123;
}
int main(void)
{
int a;
hoge(a);
printf("%d\n",a);
return 0;
}
ポインタと違ってぬるぽでガッされることがないし、アドレスに演算を加えることができないので安全ということか。ただ、ポインタと違って呼び出し側だけ見ると値渡しなのか参照渡しなのか分からない。・・・などと思うのはピュアCでポインタをがしがし使ってる旧い人間の考えか。