- ベストアンサー
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のままでした。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
わかってしまえば簡単な事です。 #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; }
その他の回答 (1)
- hitomura
- ベストアンサー率48% (325/664)
>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とは別ですのでご注意ください。
お礼
ありがとうございます。
補足
ありがとうございます。できました。 参照渡し、ポインタ渡し、という言葉は聞いたことがあったけど、 どちらも別関数の中で値自身を変更できるんですね。 参照渡し と ポインタ渡し はどういう時に使い分けるんですか? 参照渡し と ポインタ渡し の引数とかの型の違い以外の違いが 分かりませんでした。