

ポインタについてなんですけど勉強不足で疑問が出てきました

今スマートフォンで動かせる環境がないので正しい構文かわかりませんが

[code]

    void f(int *a) {*a=5;}
    
    int main(){
    　int x=1;
      f(&x);
      printf("%d",x);
      return 0;
    }
    
[/code]

この時の結果は5になるかと思います

[code]

    void f(int &a) {a=5;}
    
    int main(){
    　int x=1;
      f(x);
      printf("%d",x);
      return 0;
    }
    
[/code]

ちゃんと試していなくて申し訳ないですが...

両方5になると思います  
上の書き方と下の書き方の違いがわからないです  
生成されるオブジェクトファイル？に違いはありますか

また、どちらの方がどのような所で優れてますか


CC BY-SA 3.0
2015-07-09T17:23:25.157
12222
2015-07-10T01:02:30.677
2015-07-09T22:30:09.360
4236
10469
question
c++ ポインタ
ポインタについてなのですが


前者はポインターですが、後者は参照； reference と呼ばれます。  
ポインターの場合は`NULL`や`nullptr`を渡すことができてしまいバグの温床となり得ますが、参照の場合は構文上、`NULL`を渡し辛くなっているためポインターよりも安全性が増します。

またポインターの場合、単一の値を指すのか配列の先頭を指すのか不明確になりますが、参照の場合は明確に区別できる点も安全な記述と言えます。

[code]

    void f(int* a);        // 単一もしくは配列の先頭を指すポインター
    void f(int& a);        // 単一の参照
    void f(int (&a)[10]);  // 配列の参照
    
[/code]

* * *

ポインターはC言語・C++言語の両方に存在しますが、参照はC++言語だけでC言語には存在しません。またC言語では戻り値を省略したり後から関数を定義することができますが、C++言語では戻り値は省略できず先に宣言する必要があります。


CC BY-SA 3.0
2015-07-09T22:28:07.767
12228
2015-07-09T22:54:46.663
2015-07-09T22:54:46.663
4236
4236
12222
answer


最終的に生成される機械語は高い強度の最適化をかけ非デバッグモードのとき、  
参照とポインタで同じものになる処理系がほとんどだと思われます。  
（違う機械語が生成される必然がある状況が思いつかない）  
よって「動作速度面での優劣」は一切無いと考えてさしつかえありません。

「ソースコード記述面での優劣」は状況次第でしょうか。  
新しいぶんだけ参照のほうが安全に使えることが多いでしょう。  
昔からあるぶんだけポインタのほうが([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++' のタグが付いた質問を表示") ではなくて  
もっと新しい別の言語を使うほうが圧倒的に簡単で楽できそうな気がします。


CC BY-SA 3.0
2015-07-10T01:02:30.677
12235
2015-07-10T01:02:30.677
8589
12222
answer