質問: 3; printf("変数aの値は%dです\n", a); printf("funcDouble関数により、変数aを2倍にします\n"); funcDouble(&a); printf("変数aの値は%dです\n", a); return 0; } ```
回答: おそらくこんなことでしょうか。 関連するこれらの記事を参照してみてください。ポイントを抜粋します。 プログラミング言語2 - 4. アドレスとポインタ > > 4.1 メモリとアドレス > > 4.2 アドレスの参照 > > C言語では、変数に値を保存することができます。たとえば、整数型(int型)の変数ならば整数を保存することができるし、文字型(char)型の変数なら文字を保存することができます > > これらの変数ですが、計算機の中では、当然、メモリ上に保存されます。 メモリ上のどこに保存されるのかは、OSやコンパイラが、適時行ってくれます。 > > > * 『変数の前に & をつけると、その値をどこに保存しているか(アドレス)を参照できる』 > * 『アドレスの前に * をつけると、そのアドレスに保存している値を参照できる』 > > > 4.3 ポインタとアドレス > > > プログラミング言語2 - 8. 関数の自作の基礎 > > 8.3 関数の引数 > > 関数の引数には、 > > > * 値渡し > * アドレス渡し > > > の2通りがあります。ここでは、その内容と違いについて説明します。 > > > 8.3.2 アドレス渡し > > 関数の引数として、(変数の)アドレスを渡す方法です。 > > > 関数に渡されるのは、『変数のアドレス』です。 関数内部では、自分で使用する変数のアドレスを、引数として渡されたアドレスに設定します。 つまり、関数内部と外部で名前は異なる変数かもしれませんが、保存する場所は一緒になります。 > > > 質問記事の`void funcDouble(int *ptX)`の関数は、パラメータにint型変数へのポインタ(アドレス)を渡す必要があります。 しかし、呼び出し元の`int main(void)`関数の中で、`a`という変数は`int a = 3;`と定義されていて、int型変数そのものであり、ポインタ(アドレス)ではありません。 そこで変数`a`のアドレス値を表すために`a`の前に`&`を付けて、`(&a)`としているわけです。 ここで、`&`を付けずに`funcDouble(a);`としてコーディングすると、パラメータの型が関数宣言と違うということでコンパイル時に(オプション指定によりますが)警告またはエラーになるはずです。 警告ならコンパイル出来るかもしれませんが、動作させると想定した結果にならなかったり、segmentation faultとかaccess violationとかのエラー/例外になったりします。 あるいは`a`がint型変数ではなくint型変数へのポインタ変数であれば、`&`を付けずに指定できます。(むしろ付けると問題になる) 以下のような感じですね。 ``` int main(void) { int data = 3; int *a = &data; printf("変数aの値は%pです\n", a); printf("変数dataの値は%dです\n", data); printf("funcDouble関数により、変数aの指す先の変数dataを2倍にします\n"); funcDouble(a); printf("変数aの指す先の変数dataの値は%dです\n", *a); return 0; } ```