• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C言語】関数へのポインタ渡し)

【C言語】ポインタ渡しで配列中の最大値を発見するプログラム

このQ&Aのポイント
  • C言語で配列中の最大値を発見するプログラムをポインタ渡しで実装する方法について質問です。
  • findMax関数で渡されているparyは、aryの先頭アドレスを指すポインタ変数です。
  • findMax関数内では、pary[]を引数として受け取って、配列の最大値を見つける処理を行っています。具体的には、maxにpary[0]の値を代入し、forループ内で配列を走査し、現在の要素がmaxより大きければmaxを更新します。

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

  • ベストアンサー
回答No.2

C言語の配列の面白い性質を一つだけ。 char a[10]などあったとき、 a[1]と*(a + 1) は同じで、 *(a + 1)と*(1 + a)は同じで、 *(1 + a)と1[a]は同じです。 int findMax(int *pary,int size)でaryの先頭アドレスがparyに入っているので、 当然、*paryでary[0]の値を得られるのはわかりますよね。 *pary は *(pary + 0)と同じですから、pary[0]と同じです。 ちなみに、pary + 1の指すアドレスはparyの型によって変わります。 paryはint型変数へのポインターなので、実際のアドレスは(void*)(pary) + 1 * sizeof(int)になっています。 printf("%p\n", pary + 1)して確認してみてください。 > ポインタ変数をpary[0],pary[1],pary[2]と使った場合, > 元の配列ary[0],ary[1],ary[2]全く同じ意味になるのでしょうか? どちらも配列の同じ要素を参照しています。 なんか回し者みたいでアレですが、ポインターを理解することなくしてC言語は理解できませんから、一度「秘伝C言語問答 ポインタ編」などを読んで網羅的に理解してみてはいかがでしょうか。

taka1985a
質問者

お礼

回答ありがとうございます。 詳しく説明してくださったのでベストアンサーにさせていただきます。 >*(1 + a)と1[a]は同じです。 こちらの文の意図がわかりませんでした。 1は数字なので,変数のように扱うことはできないのでは? よくわからないことを言っていたらすいません。 オススメ本までありがとうございます。 Cの勉強はまだ一冊目の基本書をやっている所ですので, それが終わったら挑戦してみようと思います。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

関数における仮引数の宣言は特殊で, 「配列」と宣言したとしても勝手に「ポインタ」と解釈されます. つまり int findMax(int *, int); という宣言と int findMax(int [], int); という宣言とは全く同じものを意味します. 同様に, 関数定義を int findMax(int pary[],int size) ではじめても int findMax(int *pary,int size) ではじめても違いはありません. 一方, 配列名を式の中で使うと (例外的な場所を除いて) 「先頭要素へのポインタ」に自動的に変換されます.

taka1985a
質問者

お礼

回答ありがとうございます。 まだわからない箇所があります,教えて頂ければ嬉しいです。 int findMax(int *pary,int size) でparyにaryの先頭アドレスを代入し, その後 max = pary[0];を実行していますが,そこがよくわかりません。 ポインタ変数をpary[0],pary[1],pary[2]と使った場合, 元の配列ary[0],ary[1],ary[2]全く同じ意味になるのでしょうか? ポインタの示す先の値を代入する場合は, max = *pary[1]のようにするのではないのでしょうか?(コンパイルは通りませんでした。)

関連するQ&A

専門家に質問してみよう