• ベストアンサー

ポインタ渡しについて

関数の引数をint型のポインタで出力し、その関数を呼び出し側で値を取得するにはどうしたらいいのでしょうか? 一応ソースを作成しました(下記参照)が、ほしい値が出てきません。 よろしくお願い致します。 ----------------------------------------------- #include <stdio.h> int check(int *num){ int n=10; num = &n; return 0; } int main() { int m_num; check(&m_num); printf("%d\n",m_num); return 0; } ----------------------------------------- m_numに、10が格納されません。 check()でアドレス渡しをしたのですが・・・。 どうすれば、main関数で、数値を扱うことが出来ますか? よろしくお願い致します。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

*num で保持されているのは、メインでのint のデータがあるアドレスです。 &n は、呼び出された関数での変数 n のアドレスです。 num = &n ; しても、num は、スタックで介在する引数の受け渡しのような値渡しのような変数に過ぎませんから、値を変更してもそれをメインで利用することはできません。また、仮に渡しても、nは、一時的に確保された変数ですからそのようなアドレスを渡してもメインで不正なデータになります。 なので、他の方のおっしゃるように *num = n; のようにすべきです。 例えば、 コンピュータの中に MEMORY[MEM_SIZE] のような配列があって m_num に 例えばMEMORY[1234]のような場所を与えます。 例えば m_num = 11; は、コンパイラによって MEMORY[1234]=11 のような命令に置き換えられます。 &m_num で得られるアドレスとは、この場合で言う1234のようなものです。 呼び出された関数にこのアドレス(1234)を渡せば、 MEMORY[1234]=10 のように、直接メモリの内容を置き換えることができます。 それは、メインのプログラムにとっては、 m_num の内容が置き換えられることになります。

その他の回答 (4)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

int n; int *np; としたときに、 n, &n, np, *np がそれぞれ何を意味するのかがわかれば、何故このプログラムが正しく動かないのか、何故言われているように修正すると動くのか、がわかると思います。

  • black2005
  • ベストアンサー率32% (1968/6046)
回答No.3

check関数の2行目が間違い × num = &n ; ○ *num = n ;

回答No.2

スタックの問題ですね。 n=10;は、関数check()の中だけで有効です。 すなわち、関数check()が終了すればnは、どうなるかわかりません。 おそらく、nはスタック上に確保されていて次の関数printf()によってスタック上の10が破壊されているのでしょう。 要は、自動変数の値をその寿命を超えた使い方はしてはいけないと言うことです。 ※ レジスタに変数が割り当てられたときでも結果は同じです。レジスタの値はいつ破壊されるかまったくもって不明ですから。

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

折角アドレスを渡して貰ったのに、そのアドレスの中身を変えないと意味がありません。 void check(int *num){/*返り値を使わないなら「返り値無し」にすべき*/ /* int n=10;*/   *num = 10;/*渡されて来たアドレスの中身を書き換える*/ /* return 0;*//*不要なので削除*/ } int main() {   int m_num;   check(&m_num);   printf("%d\n",m_num);   return 0; }