• ベストアンサー

C++ ポインタ初級

C++で、自作関数内でメインの数字をインクリメントします。 自作関数はVOIV型でやりたいんです。 #include <stdio.h> void plus( int * ); main( ){  int a = 1;  int *&p = &a;  plus( p );  printf( "%d" , *p ); } void plus( int *i ){  ( *i )++; } int型の変数を2つ宣言したけど、1つでやる方法はないですか? #include <stdio.h> void plus( int * ); main( ){  int a = 1;  plus( &a ); // aのアドレスを渡して、  printf( "%d" , a ); } void plus( int *i ){ // アドレスの値を  ( i )++; // インクリメントしたつもりだけど } 結果は1のままでした。

質問者が選んだベストアンサー

  • ベストアンサー
noname#30727
noname#30727
回答No.1

わかってしまえば簡単な事です。 #include <stdio.h> void plus_ref(int &n) // 参照 { n++; } void plus_ptr(int *n) // ポインタ { (*n)++; } int main() { int n; n = 1; plus_ref(n); printf("%d\n", n); n = 1; plus_ptr(&n); printf("%d\n", n); return 0; }

A__
質問者

補足

ありがとうございます。できました。 参照渡し、ポインタ渡し、という言葉は聞いたことがあったけど、 どちらも別関数の中で値自身を変更できるんですね。 参照渡し と ポインタ渡し はどういう時に使い分けるんですか? 参照渡し と ポインタ渡し の引数とかの型の違い以外の違いが 分かりませんでした。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

>void plus( int *i ){ // アドレスの値を > ( i )++; // インクリメントしたつもりだけど >} 変数宣言ではint *iと書いてもint* iと書いてもint*形の変数、すなわちint形へのポインタ変数としてiを定義したとみなされます。 したがって、この関数は引数としてint形へのポインタを受け取り、そこに格納されたアドレス値をsizeof(int)分加算して終了します。このとき、呼出し元の値は変更されません。 最初に書かれた >void plus( int *i ){ > ( *i )++; >} で > plus( &a ); // aのアドレスを渡して、 としてもあなたの想定したとおりの動作を行います。 ポインタ変数宣言時の*iと実際にポインタ変数を使う場合の*iとは別ですのでご注意ください。

A__
質問者

お礼

ありがとうございます。