dポイントプレゼントキャンペーン実施中!

配列中の最大値を発見するプログラムとして,
下記のようなプロブラムが参考書にのっていましたが,よくわからない箇所があり,質問させてください。

findMaxという関数に渡されているのは,aryの先頭アドレスだと思いますが,
findMax関数内では,pary[]を引数としていますが,これはどういう意味なのでしょうか?
実際にどのような処理が行われているのかよくわかりません。

ポインタ変数?
でもそのあとにはpary[0],pary[1]として使っているしよくわかりません。
教えていただけると嬉しいです。宜しくお願いいたします。
最近Cを学び始めましたが,ポインタがまだなれません…。

============================
#include <stdio.h>
#define DATA_SIZE (12)

int ary[] = {5,7,10,1,25,15,30,10,31,13,22,32};

int findMax(int *, int);

int main(void)
{

int max;
int i;

max = findMax(ary,DATA_SIZE);
printf("Maximum number is %d\n",max);

return(0);
}

int findMax(int pary[],int size){

    int max;
      int i;

max = pary[0];
for(i = 0; i < size; i++){
if(pary[i] > max){
max = pary[i];
}
}
return(max);
}

A 回答 (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言語問答 ポインタ編」などを読んで網羅的に理解してみてはいかがでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
詳しく説明してくださったのでベストアンサーにさせていただきます。


>*(1 + a)と1[a]は同じです。
こちらの文の意図がわかりませんでした。
1は数字なので,変数のように扱うことはできないのでは?
よくわからないことを言っていたらすいません。


オススメ本までありがとうございます。
Cの勉強はまだ一冊目の基本書をやっている所ですので,
それが終わったら挑戦してみようと思います。

お礼日時:2013/12/20 23:37

関数における仮引数の宣言は特殊で, 「配列」と宣言したとしても勝手に「ポインタ」と解釈されます. つまり


int findMax(int *, int);
という宣言と
int findMax(int [], int);
という宣言とは全く同じものを意味します. 同様に, 関数定義を
int findMax(int pary[],int size)
ではじめても
int findMax(int *pary,int size)
ではじめても違いはありません.

一方, 配列名を式の中で使うと (例外的な場所を除いて) 「先頭要素へのポインタ」に自動的に変換されます.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
まだわからない箇所があります,教えて頂ければ嬉しいです。

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]のようにするのではないのでしょうか?(コンパイルは通りませんでした。)

お礼日時:2013/12/19 07:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!