質問: ポインタについてなんですけど勉強不足で疑問が出てきました 今スマートフォンで動かせる環境がないので正しい構文かわかりませんが ``` void f(int *a) {*a=5;} int main(){ int x=1; f(&x); printf("%d",x); return 0; } ``` この時の結果は5になるかと思います ``` void f(int &a) {a=5;} int main(){ int x=1; f(x); printf("%d",x); return 0; } ``` ちゃんと試していなくて申し訳ないですが... 両方5になると思います 上の書き方と下の書き方の違いがわからないです 生成されるオブジェクトファイル?に違いはありますか また、どちらの方がどのような所で優れてますか
回答: 最終的に生成される機械語は高い強度の最適化をかけ非デバッグモードのとき、 参照とポインタで同じものになる処理系がほとんどだと思われます。 (違う機械語が生成される必然がある状況が思いつかない) よって「動作速度面での優劣」は一切無いと考えてさしつかえありません。 「ソースコード記述面での優劣」は状況次第でしょうか。 新しいぶんだけ参照のほうが安全に使えることが多いでしょう。 昔からあるぶんだけポインタのほうが([c](/questions/tagged/c "'c' のタグが付いた質問を表示")言語ユーザには)親しまれているでしょう。 ポインタなら nullptr を渡せますが、これは欠点でもあり利点でもあります。 ポインタなら「配列の先頭」を渡して配列丸ごとを扱えますが、これも欠点でもあり利点でもあります。 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") には参照はありませんのでポインタを使わざるを得ません。 [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") に限定すればポインタの利用を廃して参照だけでソース書くことも可能です。 (ちょっと語弊があるかも・・・) が、そもそもポインタをまったく使わないのであれば [c](/questions/tagged/c "'c' のタグが付いた質問を表示") や [c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") ではなくて もっと新しい別の言語を使うほうが圧倒的に簡単で楽できそうな気がします。