ポインタについてなのですが


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

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

[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になると思います  
上の書き方と下の書き方の違いがわからないです  
生成されるオブジェクトファイル？に違いはありますか

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




前者はポインターですが、後者は参照； 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++言語では戻り値は省略できず先に宣言する必要があります。

